使用自定义CheckBox的WPF ListView多选

时间:2016-04-04 05:59:35

标签: wpf xaml listview data-binding multi-select

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

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上绑定ListView个类来进行类选择。

<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上显示所选类的属性以进行属性选择。

<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相关字段与我的模型分离。

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

1 个答案:

答案 0 :(得分:1)

使用混合行为。

Collection中使用ViewModel选定的项目。

写一个名为ICommand的{​​{1}}并传递1/0参数以添加/删除项目。

UpdateSelectedItemsCommand