当我在视图中有一个comboBox并希望一个空项能够取消选择该选项时,我在我的视图中使用了这个代码:
<ComboBox.Resources>
<CollectionViewSource x:Key="comboBoxSource" Source="{Binding ElementName=ucPrincipal, Path=DataContext.MyProperty}" />
</ComboBox.Resources>
<ComboBox.ItemsSource>
<CompositeCollection>
<entities:MyType ID="-1"/>
<CollectionContainer Collection="{Binding Source={StaticResource comboBoxSource}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
在这种情况下,是将ID设置为-1以指示该特殊项目的视图。但我不太喜欢这个解决方案,因为视图模型取决于视图是否正确设置它。
所以我想在我的视图模型中使用这个属性:
public readonly MyType MyNullItem = new MyType();
但我不知道如何在视图中的复合集合中使用它而不是:
<entities:MyType ID="-1"/>
有可能吗?
感谢。
答案 0 :(得分:1)
你需要某种绑定转换器,它将一个列表和一个对象组合成CompositeCollection
。前段时间我实现了类似的转换器,区别在于它将多个集合转换为一个:
/// <summary>
/// Combines multiple collections into one CompositeCollection. This can be useful when binding to multiple item sources is needed.
/// </summary>
internal class MultiItemSourcesConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
var result = new CompositeCollection();
foreach (var collection in values.OfType<IEnumerable<dynamic>>()) {
result.Add(new CollectionContainer { Collection = collection });
}
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
}
这种转换器的使用在XAML中看起来像这样:
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource MultiItemSourcesConverter}">
<Binding Path="FirstCollection" />
<Binding Path="SecondCollection" />
</MultiBinding>
</ComboBox.ItemsSource>