Wpf 当SelectedValue不是ItemsSource的一部分时,自动清除组合框中的SelectedValue

Wpf 当SelectedValue不是ItemsSource的一部分时,自动清除组合框中的SelectedValue,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我的WPF应用程序中有一些组合框,可以使用SelectedValue和SelectedValuePath进行选择。有时,SelectedValue不是ItemsSource的一部分,因为数据库不一致 例如: Items = new ObservableCollection<Item>() { new Item() { Id = "1", Text = "Text 1" }, new Item() { Id = "2", Text = "Text 2" }, }; S

我的WPF应用程序中有一些组合框,可以使用SelectedValue和SelectedValuePath进行选择。有时,SelectedValue不是ItemsSource的一部分,因为数据库不一致

例如:

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

SelectedValue = "3";
视图模型:

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; }

}

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

因此,与其尝试在视图或控件中实现这种逻辑,不如在它所属的视图模型中实现它。这应该非常简单:

SelectedValue = "3";
if (!Items.Any(x => x.Id == SelectedValue))
    SelectedValue = null;
或者在setter中:

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

此逻辑应在视图模型中实现,即,当ItemsSource中没有此类项时,不应将SelectedValue设置为3。然后将视图模型设置为无效状态。我认为他们无法对其中的有效内容做出任何安全的假设。例如,viewmodel可能希望有多个潜在的无效值。您的SelectedValue属性设置程序必须强制执行此操作。IsSynchronizedWithCurrentItem=True并使用SelectedItem而不是SelectedValue@blindmeis我也试过了,即使组合框显示了第一个选中的项目,底层的SelectedItem仍然是无效的。好的,我将为每个SelectedValue属性手动执行此操作。我有一半的期望会有一些绑定选项来验证当前SelectedValue。谢谢你的回答!
public string SelectedValue
{
    get { return selectedValue; }
    set
    {
        selectedValue = value;
        if (!Items.Any(x => x.Id == SelectedValue))
            selectedValue = null;
        OnPropertyChanged();
    }
}