我的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”)。当绑定(bind)不是SelectedValue的一部分时,有没有办法让绑定(bind)自动清除ItemsSource

看法:
<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; }

}

最佳答案

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

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

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

关于wpf - 当它不属于ItemsSource时,自动从ComboBox中清除SelectedValue。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43659335/

10-12 06:42