【问题标题】:Combobox does not change value when a different value is selected选择不同的值时,组合框不会更改值
【发布时间】:2012-02-21 15:01:02
【问题描述】:

我正在尝试将我在 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&lt;Device&gt; _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");
    }
}

OnPropertyChanged 仅在事件不为 null 时引发事件 PropertyChanged。我是 WPF 的新手(老实说,我对 C# 也很陌生)所以我不确定我是否遗漏了一些基本的东西。知道为什么这个组合框不会改变我的值吗?

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    在这里我自己发现了答案。意外行为是使用 Leadtools 设备类的结果。它是一个 COM 组件,显然不能很好地与我的应用程序配合使用。老实说,我不明白它为什么会起作用,但是我将 Device 类包装在另一个类中并改用它。一旦我使用了包装类,组合框就可以正常工作。

    【讨论】:

      【解决方案2】:

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

      改变

      if (_currentDevice = value) 
      

      if (_currentDevice == value)
      

      【讨论】:

      • 感谢您的回复,但这实际上是一个错字。我会在问题中解决这个问题。无论如何,我确实发现了问题。我在那里使用的Device 类是一个COM 组件,并且由于某种原因不能很好地播放。我将它包装在一个包装类中并改用它,组合框奇迹般地工作。
      【解决方案3】:

      试试下面的

      if _currentDevice == value ...
      

      【讨论】:

      • 感谢文森特的回复。这实际上是我的一个错字。我对我的问题的解决方案在我上面对 Darren Young 的回复中。
      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 2022-01-23
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多