Wpf 当SelectedValue不是ItemsSource的一部分时,自动清除组合框中的SelectedValue
我的WPF应用程序中有一些组合框,可以使用SelectedValue和SelectedValuePath进行选择。有时,SelectedValue不是ItemsSource的一部分,因为数据库不一致 例如: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
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();
}
}