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
。
编写一个名为 UpdateSelectedItemsCommand
的 ICommand
并为 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>
我有一个相当复杂的对象模型,它具有嵌套的自定义集合 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
。
编写一个名为 UpdateSelectedItemsCommand
的 ICommand
并为 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>