【发布时间】:2013-07-25 03:28:44
【问题描述】:
我在我的 WPF 应用程序中使用 ComboBox 并遵循 MVVM。我想在 ComboBox 中显示一个字符串列表。
XAML:
<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem}" />
查看模型:
public Collection<string> ItemsCollection; // Suppose this has 10 values.
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
Trigger Notify of property changed.
}
}
现在这段代码运行良好。我可以从视图中进行选择,并且可以在 ViewModel 中进行更改,如果我从 ViewModel 更改 SelectedItem,我可以在我的视图中看到它。
现在这就是我想要实现的目标。当我从我的视图中更改所选项目时,我需要检查值是好/坏(或任何东西)设置所选项目,否则不要设置它。所以我的视图模型变成了这样。
public string SelectedItem
{
get { return _selectedItem; }
set
{
if (SomeCondition(value))
_selectedItem = value; // Update selected item.
else
_selectedItem = _selectedItem; // Do not update selected item.
Trigger Notify of property changed.
}
}
现在,当我执行此代码并且 SomeCondition(value) 返回 false 时,SelectedItem 返回旧字符串值,但在我看来,ComboBox 中的选定项是我选择的值。因此,假设我的 ComboBox 中显示了 10 个字符串的集合。除第二个和第四个元素外,所有值都很好(SomeCondition 对第二个和第四个值返回 false)。如果我选择第二个或第四个元素 selectedItem ,我想要什么不要改变。但是我的代码没有正确执行此操作。如果我选择第二个元素,则视图仍将第二个元素显示为选中状态。我知道我的代码有问题。但它是什么?
【问题讨论】:
-
这不是一个非常用户友好的设计。如果我在组合框中选择某些东西,我希望它是我选择的项目。您应该改为从组合框中删除无效选项。如果选择的有效性基于另一个 UI 元素的选定值,则更改该选择应触发重建组合框的 ItemSource。
-
这是显示所有项目的要求,不能更改。
-
我同意不显示无效选项,或者将它们变灰并禁用它们的选择,这就是 UI 的用途。
-
让您在视图中选择第二个项目,但会显示 IDataErrorInfo 错误。所以你可以从你的设置器中删除你的“验证”并将其放在 IDataErrorInfo 中。但是,如果您将最后一个“好”值设置为您的选定项目并执行 OnPropertyChanged(),它应该可以工作
标签: c# wpf mvvm combobox selecteditem