【发布时间】:2011-11-02 05:11:18
【问题描述】:
我遇到了 Silverlight 4.0 中的一对组合框的问题。
目的是让两个不同的组合框从同一个列表中读取,但如果其中一个选择的任何项目不会显示在另一个中(因为基础属性不允许相同)。
例如(这只是示例代码,但同样代表了它的工作原理)
<ComboBox ItemsSource="{Binding BackgroundColors}"
SelectedItem="{Binding SelectedBackgroundColor, Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding ForegroundColors}"
SelectedItem="{Binding SelectedForegroundColor, Mode=TwoWay}" />
为了允许这种动态过滤,我的 ViewModel 中有 2 个不同的 ICollectionView,每个组合框 ItemsSource 都绑定到这些 ICollectionView。每个ICollectionView 都有一个相同的ObservableCollection<T> 的来源,但在过滤器中设置为过滤掉对方的选中项。
private ObservableCollection<Color> _masterColorList;
public ICollectionView BackgroundColors { get; }
public ICollectionView ForegroundColors { get; }
当在 UI 中更改 SelectedItem 时,ViewModel 属性会更新,作为其中的一部分,相反的 ICollectionView 会通过 .Refresh() 刷新。
例如。
public Color SelectedForegroundColor
{
get { return _selectedForegroundColor; }
set
{
if (_selectedForegroundColor == value)
return;
_selectedForegroundColor = value;
BackgroundColors.Refresh();
RaisePropertyChanged(() => SelectedForegroundColor);
}
}
这允许过滤器重新运行并更改可供选择的内容。
这很好用,但是有一个问题:
假设我们的主列表中有 3 种颜色:
- 蓝色
- 绿色
- 红色
已选择组合框 1 (CB1) 蓝色 组合框 2 (CB2) 已选择 Green
因此组合框有这些列表(粗体被选中)
CB1
- 蓝色
- 红色
CB2
- 绿色
- 红色
如果我随后在 CB1 中选择 Red,我希望 Red 将从 CB2 中删除,并用 Blue 替换它。这发生正确,但显示的值从 Green 变为 Blue。
基础绑定值没有改变,并且 ICollectionView.CurrentItem 是正确的,但显示显然显示了错误的值。
我认为正在发生的事情是,因为 Green 在列表中较早,所以它与所显示的内容混淆了。如果您对 ICollectionView 进行排序,也会发生这种情况。
我已尝试为更改的组合框和选定项重新引发属性更改事件通知,但这似乎不起作用。
以前有没有人见过这个问题,或者有什么想法可以解决它?
【问题讨论】:
标签: silverlight mvvm combobox icollectionview