WPF ListView 多选在内部使用自定义 CheckBox

WPF ListView multiselection using custom CheckBox inside

我有一个相当复杂的对象模型,它具有嵌套的自定义集合 objects/models,如下所示:

public sealed class LibraryInfo : NamedModel
{       
    public ClassInfos _classes;       
    public ClassInfos Classes
    {
        get { return _classes; }
        set { SetProperty(ref _classes, value); }
    }
}

public class ClassInfos : List<ClassInfo> { }

public sealed class ClassInfo : NamedModel
{
    public PropertyInfos _properties;     
    public PropertyInfos Properties
    {
        get { return _properties; }
        set { SetProperty(ref _properties, value); }
    }
}

public class PropertyInfos : List<PropertyInfo> { }

public sealed class PropertyInfo : NamedModel
{
}

我想将 LibraryInfo classes 绑定到一个 ListView 上以供 classes 选择。

<ListView SelectedItem="{Binding SelectedClass}" ItemsSource="{Binding LibraryInfo.Classes}">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
        </GridView>
    </ListView.View>
</ListView>

并且基于 ClassInfo 选择,我想在另一个 ListView 上显示所选 class 的属性以进行属性选择。

<ListView ItemsSource="{Binding SelectedClass.Properties}">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
        </GridView>
    </ListView.View>        
</ListView>

问题是我如何跟踪选中的 (CheckBox IsChecked) 项目,因为我的原始模型不包含任何此类 属性 像 IsActive,以保持 UI 相关字段与我的模型分离。

我正在寻找一个优雅而简单的解决方案来解决这个问题。

使用混合行为。

在您的 ViewModel 中为所选项目使用 Collection

编写一个名为 UpdateSelectedItemsCommandICommand 并为 adding/deleting 项传递 1/0 参数。

        <CheckBox ...>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Checked">
                    <i:InvokeCommandAction Command="{Binding UpdateSelectedItemsCommand}"
                                                            CommandParameter="1"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="Unchecked">
                    <i:InvokeCommandAction Command="{Binding UpdateSelectedItemsCommand}"
                                                            CommandParameter="0"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </CheckBox>