我的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”)。当绑定(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/