多个ComboBox绑定到公共源,强制执行不同的选择

我正在尝试将多个ComboBox绑定到一个公共源集合,并强制执行一次ComboBox选择后,所选项目将从其他ComboBox中删除。 该集合是动态构建的,所以我在代码中进行。

到目前为止,我已尝试以多种方式实现这一点,而我似乎无法想出一些真正有用的东西。

我已经尝试使用默认视图的Filter谓词,但它只传递了该项,我无法知道哪个控件正在进行过滤(它在概念上甚至没有意义)。

我已经尝试创建新的CollectionView,但行为最终会有所不同(获取SelectionChange事件,而我之前没有使用默认视图)。

几个小时以来我一直在反对这个问题,而且似乎并不想工作。 我希望有更多经验丰富的WPF帮助我找到一个有效的例子。 我真的希望它不会从集合中自动选择项目并开始空白(否则,每个ComboBox将有一个独特的自动选择,这太过于冒昧)。

我真的很接近允许广泛选择并在以后validation它,但这似乎是一个如此简单的概念,有这么难以置信的困难。

谢谢

好问题,我想到了它,我可能会用MultiBinding和相应的ValueConverter接近它,即

                                 
 public class ComboBoxItemsSourceFilter : IMultiValueConverter { #region IMultiValueConverter Members public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var collection = new List((object[])values[0]); foreach (var item in values.Skip(1)) { if (item != null) collection.Remove(item); } return collection; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } #endregion } 

因为你在代码中执行此操作后面添加所有这些绑定不应该是一个大问题,只需将所有combobox放入一个列表中,你就可以迭代它们。 转换器可能需要一些调整,因为它假定输入集合( values[0] )可以转换为object[]

这样做的方式令人遗憾地导致许多第一次机会exception,其原因我到目前为止无法确定……

UIAutomationProvider.dll中发生了’System.Runtime.InteropServices.COMException’类型的第一次机会exception

我不太确定我第一次做错了什么,但是我确实改变了一些事情,让我原来的尝试工作。

我遇到的问题可能是直接使用CollectionView的结果,在调试输出中有一个警告。 它声明直接使用CollectionView并不完全支持并且可能有错误的行为。

我最终切换到ListCollectionView。 我还创建了一个新的List <>,其中包含我的源集合的内容,它允许我向列表中添加一个空白对象(不更改我的原始数据结构)。 我只是在选择更改时忽略它并将其无条件地包含在Filter中。

所以使其工作的步骤:
1)包含源IList的ListCollectionView
2)将Filter谓词添加到视图中
3)使用视图创建绑定作为源
4)ComboBox.ItemsSource上的combo.SetBinding
5)在选择更改事件时,确保将每个组合的ItemsSource转换为ICollectionView并调用Refresh(因为它需要重新过滤,并且不会注意到属性更改通知)