我正在尝试将我在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应用程序中的循环,该应用程序使用当前计算机上的所有可用捕获设备填充列表。我有一个public CollectionView DevicesCollection { get; private set; }
用于在应用程序开始时获取/设置设备。我当前设备的属性如下:
public Device CurrentDevice
{
get { return _currentDevice; }
set
{
if (_currentDevice = value)
{
return;
}
_currentDevice = value;
OnPropertyChanged("CurrentDevice");
}
}
如果事件不为null,OnPropertyChanged只会引发事件PropertyChanged
。我是WPF的新手(一般来说,对C#来说很新,老实说)所以我不确定我是否遗漏了一些基本的东西。知道为什么这个组合框不会改变我的价值吗?
答案 0 :(得分:0)
尝试以下
if _currentDevice == value ...
答案 1 :(得分:0)
您正在使用赋值运算符'='而不是等于运算符'=='
更改
if (_currentDevice = value)
到
if (_currentDevice == value)
答案 2 :(得分:0)
我自己在这里发现了答案。意外行为是使用Leadtools Device类的结果。它是一个COM组件,显然与我的应用程序没有很好地协作。老实说,我不明白为什么它确实有效,但我将Device类包装在另一个类中并使用它。只要我使用包装器类,组合框就会按原样运行。