2012-02-21 145 views
0

我正尝试将我在WinForms中创建的小型原型应用程序迁移到WPF。当我从下拉菜单中选择一个不同的值时,我在WPF中的组合框出现了一些问题,无法更改值。最初,我尝试复制我在WinForms应用程序中使用的代码来填充组合框,并确定是否选择了新索引。这是我的WinForms代码是如何看起来像:当选择不同的值时,组合框不会更改值

private void cmbDeviceList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var cmb = (Combobox) sender; 
    var selectedDevice = cmb.SelectedItem; 
    var count = cmbDeviceList.Items.Count; 

    // find all available capture devices and add to drop down 
    for(var i =0; i<count; i++) 
    { 
     if(_deviceList[i].FriendlyName == selectedDevice.ToString()) 
     { 
      _captureCtrl.VideoDevices[i].Selected = true; 
      break; 
     } 
    } 
} 

代码早些时候,我填充_deviceList列表和组合框(在Form1_Load是具体的)通过循环通过现有的设备和添加。我在WPF中尝试了相同的方法,只能填充组合框。当我选择一个新值时,出于某种原因,相同的确切值(初始设备)被发送到事件代码中(我的WPF应用程序中的cmbCaptureDevices_SelectionChanged)。我四处寻找WPF中的一些教程,发现可能数据绑定是我的问题,我尝试了一下。这是我在我的XAML文件组合框:

<ComboBox ItemsSource="{Binding Devices}" Name="cmbCaptureDevices" 
    IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding CurrentDevice, 
    Mode=TwoWay}" Se;ectionChanged="cmbCapturedDevices_SelectionChanged" /> 

还有更多的是XAML的定义,但它像HorizontalAlignment和诸如此类的东西都随意的东西。我的VideoDevicesViewModel继承自INotifyPropertyChanged,有一个private List<Device> _devices和一个private Device _currentDevice。构造函数看起来像:

public VideoDevicesViewModel() 
{ 
    _devices = GetCaptureDevices(); 
    DevicesCollection = new CollectionView(_devices); 
} 

GetCaptureDevices简单说就是循环,我在我的WinForms应用程序,其填充当前机器上的所有avaialble捕获设备列表中。我有一个public CollectionView DevicesCollection { get; private set; }用于在应用程序启动时获取/设置设备。我现在的设备属性的样子:

public Device CurrentDevice 
{ 
    get { return _currentDevice; } 
    set 
    { 
     if (_currentDevice = value) 
     { 
      return; 
     } 
     _currentDevice = value; 
     OnPropertyChanged("CurrentDevice"); 
    } 
} 

OnPropertyChanged只是引发事件PropertyChanged如果事件不为空。我是WPF的新手(对于C#而言,诚实地说新手),所以我不确定是否缺少一些基本的东西。任何想法,为什么这个组合框不会改变我的价值观?

回答

0

在我这里发现了我自己的答案。意外的行为是使用Leadtools设备类的结果。这是一个COM组件,显然与我的应用程序没有很好的搭配。我真的不明白为什么它的工作原理,但我把Device类包装在另一个类中,并用它来代替。一旦我使用包装类,组合框就像它应该那样运行。

0

请尝试以下

if _currentDevice == value ... 
+0

感谢您的答复文森特。这实际上是我的一个错字。我对我的问题的解决方案是在我对上面的Darren Young的回复中。 – Zajn 2012-02-22 01:02:52

0

您正在使用赋值运算符'=',而不是平等的经营者'=='

变化

if (_currentDevice = value) 

if (_currentDevice == value) 
+0

感谢您的回复,但这实际上是一个错字。我会在问题中解决这个问题。无论如何,我确实发现了这个问题。我在那里使用的'Device'类有一个COM组件,并且出于某种原因没有很好地播放。我把它包装在一个包装类中,并用它来代替,而组合框奇迹般地工作。 – Zajn 2012-02-22 01:01:59

相关问题