我正尝试将我在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#而言,诚实地说新手),所以我不确定是否缺少一些基本的东西。任何想法,为什么这个组合框不会改变我的价值观?
感谢您的答复文森特。这实际上是我的一个错字。我对我的问题的解决方案是在我对上面的Darren Young的回复中。 – Zajn 2012-02-22 01:02:52