我在WPF应用程序中具有ComboBoxes
,可以使用SelectedValue
和SelectedValuePath
选择。有时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();
}
}