Combobox - 在itemssource更改后更新并选择新添加的项目

11 浏览
0 Comments

Combobox - 在itemssource更改后更新并选择新添加的项目

我有一个简单的WPF表单,其中包含一个ComboBox和一个按钮。ComboBox的ItemSource是一个包含目录中文件名称的字典。按钮用于通过使用打开文件对话框来复制添加新文件。

我用于绑定的代码:

cmbClasses.ItemsSource = classList;
cmbClasses.DisplayMemberPath = "Key";
cmbClasses.SelectedValuePath = "Value";

我希望在将新文件添加到字典后ComboBox可以刷新项目并将其设置为SelectedItem。

我尝试了以下代码来刷新,但没有效果:

cmbClasses.Items.Clear();
cmbClasses.ItemsSource = classList;
cmbClasses.DisplayMemberPath = "Key";
cmbClasses.SelectedValuePath = "Value";

我在这里看到了一些问题,但没有一个能帮助我。有人知道我该如何做到这一点吗?

0
0 Comments

问题的原因是当下拉框的数据源发生变化时,无法自动更新并选中新添加的项。

解决方法是首先将ItemsSource绑定到一个能够通知属性变化事件的ObservableCollection或其他类似的对象。这样可以在列表变化时自动更新下拉框。然后将选中的值绑定到另一个属性,并动态设置该值为刚刚添加的值。

可以通过以下代码实现:

// 定义ObservableCollection用于绑定下拉框的数据源
public ObservableCollection ItemsSource { get; set; } = new ObservableCollection();
// 定义选中的值
private string selectedValue;
public string SelectedValue
{
    get { return selectedValue; }
    set
    {
        selectedValue = value;
        RaisePropertyChanged(nameof(SelectedValue));
    }
}
// 添加新项到数据源并选中
ItemsSource.Add("New Item");
SelectedValue = "New Item";

使用ObservableDictionary也是一种解决方法。ObservableDictionary在变化时会触发通知,可以满足需求。此外,还有其他类似的类,如ObservableList等。也可以自己实现一个类似的通知机制。在新版本的.NET中,可以使用MemberCallerName属性来替代显式地发送属性变化的通知,使代码更加简洁。

参考链接:

- [Binding ComboBox SelectedItem using MVVM](https://stackoverflow.com/questions/19632270)

- [Can I bind my ItemsControl to a Dictionary?](http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/)

0