当选择不同的值时,组合框不会更改值
我正尝试将我在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#而言,诚实地说新手),所以我不确定是否缺少一些基本的东西。任何想法,为什么这个组合框不会改变我的价值观?
在我这里发现了我自己的答案。意外的行为是使用Leadtools设备类的结果。这是一个COM组件,显然与我的应用程序没有很好的搭配。我真的不明白为什么它的工作原理,但我把Device类包装在另一个类中,并用它来代替。一旦我使用包装类,组合框就像它应该那样运行。
请尝试以下
if _currentDevice == value ...
您正在使用赋值运算符'=',而不是平等的经营者'=='
变化
if (_currentDevice = value)
到
if (_currentDevice == value)
感谢您的回复,但这实际上是一个错字。我会在问题中解决这个问题。无论如何,我确实发现了这个问题。我在那里使用的'Device'类有一个COM组件,并且出于某种原因没有很好地播放。我把它包装在一个包装类中,并用它来代替,而组合框奇迹般地工作。 – Zajn 2012-02-22 01:01:59
感谢您的答复文森特。这实际上是我的一个错字。我对我的问题的解决方案是在我对上面的Darren Young的回复中。 – Zajn 2012-02-22 01:02:52