Хороший вопрос, я думал об этом, и я, вероятно, подхожу к нему с помощью MultiBinding и соответствующего ValueConverter, т.е.
<StackPanel>
<StackPanel.Resources>
<local:ComboBoxItemsSourceFilter x:Key="ComboBoxItemsSourceFilter"/>
</StackPanel.Resources>
<ComboBox Name="cb1">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
<Binding Path="Emps"/> <!-- Source collection binding -->
<Binding ElementName="cb2" Path="SelectedItem"/>
<Binding ElementName="cb3" Path="SelectedItem"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
<ComboBox Name="cb2">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
<Binding Path="Emps"/>
<Binding ElementName="cb1" Path="SelectedItem"/>
<Binding ElementName="cb3" Path="SelectedItem"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
<ComboBox Name="cb3">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
<Binding Path="Emps"/>
<Binding ElementName="cb1" Path="SelectedItem"/>
<Binding ElementName="cb2" Path="SelectedItem"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
</StackPanel>
public class ComboBoxItemsSourceFilter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var collection = new List<object>((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
}
Поскольку вы делаете это в коде, добавляющем все эти привязки, не должно быть большой проблемой, просто бросьте все комбинированные списки в список, и вы можете их перебирать. Преобразователю может потребоваться некоторая настройка, поскольку предполагается, что набор входных данных (values[0]
) может быть приведен к object[]
.
Этот способ, к сожалению, вызывает множество исключений из первого шанса, причину которых я до сих пор не могу определить ...
Первое случайное исключение типа 'System.Runtime.InteropServices.COMException' произошло в UIAutomationProvider.dll