当所选值从Commobox不属于commobox的一部分时,将其清除



我在WPF应用程序中具有ComboBoxes,可以使用SelectedValueSelectedValuePath选择。有时SelectedValue不是ItemsSource的一部分(因为数据库不一致(。

示例:

Items = new ObservableCollection<Item>()
{
    new Item() { Id = "1", Text = "Text 1" },
    new Item() { Id = "2", Text = "Text 2" },
};
SelectedValue = "3";

当加载ComboBox并且未选择其他值时,SelectedValue属性仍然是不一致的值(示例中的" 3"(。当它不是ItemsSource的一部分时,有没有办法让绑定自动清除SelectedValue

查看:

<ComboBox ItemsSource="{Binding Items}" 
              SelectedValuePath="Id" 
              SelectedValue="{Binding SelectedValue, Mode=TwoWay}" 
              DisplayMemberPath="Text" />

ViewModel:

public class MainWindowViewModel : ViewModel
{
    public MainWindowViewModel()
    {
        Items = new ObservableCollection<Item>()
        {
            new Item() {Id ="1", Text = "Text 1" },
            new Item() {Id ="2", Text = "Text 2" },
        };
        SelectedValue = "3";
    }
    private ObservableCollection<Item> items;
    public ObservableCollection<Item> Items
    {
        get { return items; }
        set { items = value; OnPropertyChanged(); }
    }
    private string selectedValue;
    public string SelectedValue
    {
        get { return selectedValue; }
        set { selectedValue = value; OnPropertyChanged(); }
    }
}
public class Item
{
    public string Id { get; set; }
    public string Text { get; set; }
}

应该在视图模型中实现此逻辑,即,当Items中没有此类项目时,切勿将SelectedValue设置为3。然后,您将视图模型设置为无效状态。

因此,而不是试图在视图中实现这种逻辑,或者您不应在其属性的视图模型中实现它。它应该非常简单:

SelectedValue = "3";
if (!Items.Any(x => x.Id == SelectedValue))
    SelectedValue = null;

或在设置中:

public string SelectedValue
{
    get { return selectedValue; }
    set
    {
        selectedValue = value;
        if (!Items.Any(x => x.Id == SelectedValue))
            selectedValue = null;
        OnPropertyChanged();
    }
}

最新更新