选择不同的值时,Combobox不会更改值

时间:2012-02-21 15:01:02

标签: c# wpf combobox

我正在尝试将我在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> _devicesprivate 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#来说很新,老实说)所以我不确定我是否遗漏了一些基本的东西。知道为什么这个组合框不会改变我的价值吗?

3 个答案:

答案 0 :(得分:0)

尝试以下

if _currentDevice == value ...

答案 1 :(得分:0)

您正在使用赋值运算符'='而不是等于运算符'=='

更改

if (_currentDevice = value) 

if (_currentDevice == value)

答案 2 :(得分:0)

我自己在这里发现了答案。意外行为是使用Leadtools Device类的结果。它是一个COM组件,显然与我的应用程序没有很好地协作。老实说,我不明白为什么它确实有效,但我将Device类包装在另一个类中并使用它。只要我使用包装器类,组合框就会按原样运行。