如何在 CompositeCollection 中使用 属性 的视图模型?

How to use a property of the view model in a CompositeCollection?

当我在我的视图中有一个组合框并希望一个空项目能够取消选择该选项时,我在我的视图中使用此代码:

<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"/>

可能吗?

谢谢。

您需要某种绑定转换器,它将一个列表和一个对象组合成 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>