完整教程:wpf Behaviors库实现支持多选操作进行后台绑定数据的ListView

<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
<
i:Interaction.Behaviors>
<
behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
<ListView.View>
<GridView>
<GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/>
</GridView>
</ListView.View>
</ListView>
1. ListView控件的定义
<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
ItemsSource="{Binding SchemeItems}":- 这是数据绑定的属性,表示
ListView的数据源绑定到视图模型(ViewModel)中的SchemeItems属性。 SchemeItems应该是一个集合类型(如ObservableCollection),其中存储了要显示在ListView中的数据项。
- 这是数据绑定的属性,表示
SelectionMode="Extended":- 设置
ListView的选中模式为“扩展模式”,允许用户通过按下Ctrl或Shift键选择多个项目。
- 设置
VerticalAlignment="Stretch"和HorizontalAlignment="Stretch":- 这两个属性设置
ListView在父容器中垂直和水平方向上拉伸以填充可用空间。
- 这两个属性设置
2. 上下文菜单(ContextMenu)
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
ContextMenu:- 定义了
ListView的上下文菜单,即用户右键单击ListView时显示的菜单。
- 定义了
MenuItem Header="删除" Command="{Binding DeleteSelectedItemCommand}":- 定义了一个菜单项,标题为“删除”。
Command="{Binding DeleteSelectedItemCommand}":- 绑定了一个命令,当用户点击“删除”菜单项时,会触发视图模型中的
DeleteSelectedItemCommand命令。 - 这个命令通常用于删除选中的项目。
- 绑定了一个命令,当用户点击“删除”菜单项时,会触发视图模型中的
3. 行为(Interaction.Behaviors)
<
i:Interaction.Behaviors>
<
behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
Interaction.Behaviors:- 使用了
System.Windows.Interactivity命名空间(通常通过xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"引入)来添加行为。
- 使用了
behaviors:SelectedItemsBehavior:- 这是一个自定义行为,可能是为了处理
ListView的多选项目。
- 这是一个自定义行为,可能是为了处理
SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}":- 将行为的
SelectedItems属性与视图模型中的SelectedSchemeItems属性进行双向绑定。 - 这样,当用户在
ListView中选择项目时,SelectedSchemeItems会自动更新,反之亦然。
- 将行为的
4. ListView的视图(ListView.View)
<ListView.View>
<GridView>
<GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/>
</GridView>
</ListView.View>
ListView.View:- 定义了
ListView的显示方式,这里使用了GridView,即表格视图。
- 定义了
GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}":- 定义了一个表格列,标题为“方案名”。
DisplayMemberBinding="{Binding Name}":- 表示该列显示的数据项的
Name属性值。 - 假设
SchemeItems集合中的每个项目都有一个Name属性,那么这个属性的值将显示在该列中。
- 表示该列显示的数据项的
public
class SelectedItemsBehavior : Behavior<ListView>
{
public
static
readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register(
nameof(SelectedItems)
,
typeof(ObservableCollection<SchemeItem>
)
,
typeof(SelectedItemsBehavior
)
,
new FrameworkPropertyMetadata(
null
, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
)
;
public ObservableCollection<SchemeItem> SelectedItems
{
get =>
(ObservableCollection<SchemeItem>
)GetValue(SelectedItemsProperty)
;
set =>
SetValue(SelectedItemsProperty,
value
)
;
}
protected
override void OnAttached(
)
{
base.OnAttached(
)
;
AssociatedObject.SelectionChanged += OnSelectionChanged;
}
protected
override void OnDetaching(
)
{
AssociatedObject.SelectionChanged -= OnSelectionChanged;
base.OnDetaching(
)
;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectedItems =
new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>(
)
)
;
}
}
下面代码定义了一个名为SelectedItemsBehavior的行为类,用于扩展ListView的功能,特别是处理多选项目并将其与视图模型绑定:
1. 类定义
public
class SelectedItemsBehavior : Behavior<ListView>
Behavior<ListView>:- 这是一个从
System.Windows.Interactivity.Behavior<T>继承的类,专门用于为ListView控件添加行为。 Behavior<T>是WPF中用于扩展控件功能的机制,允许开发者通过附加行为来增强控件的功能,而无需修改控件本身的代码。
- 这是一个从
2. 依赖属性(DependencyProperty)
public
static
readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register(
nameof(SelectedItems)
,
typeof(ObservableCollection<SchemeItem>
)
,
typeof(SelectedItemsBehavior
)
,
new FrameworkPropertyMetadata(
null
, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
)
;
DependencyProperty.Register:- 定义了一个名为
SelectedItemsProperty的依赖属性,用于存储选中的项目集合。 nameof(SelectedItems):属性的名称。typeof(ObservableCollection<SchemeItem>):属性的类型,表示选中的项目是一个ObservableCollection<SchemeItem>集合。typeof(SelectedItemsBehavior):依赖属性所属的类。FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault):- 设置了默认值为
null。 - 设置了
BindsTwoWayByDefault选项,表示该属性默认支持双向绑定。
- 设置了默认值为
- 定义了一个名为
3. SelectedItems属性
public ObservableCollection<SchemeItem> SelectedItems
{
get =>
(ObservableCollection<SchemeItem>
)GetValue(SelectedItemsProperty)
;
set =>
SetValue(SelectedItemsProperty,
value
)
;
}
- 这是一个包装了
SelectedItemsProperty依赖属性的CLR属性。 - 通过
GetValue和SetValue方法,可以方便地获取和设置SelectedItemsProperty的值。
4. 附加行为(OnAttached)
protected
override void OnAttached(
)
{
base.OnAttached(
)
;
AssociatedObject.SelectionChanged += OnSelectionChanged;
}
OnAttached:- 当行为被附加到
ListView控件时,会调用此方法。 AssociatedObject:- 表示行为所附加的控件,在这里是
ListView。
- 表示行为所附加的控件,在这里是
AssociatedObject.SelectionChanged += OnSelectionChanged:- 订阅了
ListView的SelectionChanged事件,当ListView的选中项发生变化时,会触发OnSelectionChanged方法。
- 订阅了
- 当行为被附加到
5. 分离行为(OnDetaching)
protected
override void OnDetaching(
)
{
AssociatedObject.SelectionChanged -= OnSelectionChanged;
base.OnDetaching(
)
;
}
OnDetaching:- 当行为从
ListView控件分离时,会调用此方法。 AssociatedObject.SelectionChanged -= OnSelectionChanged:- 取消订阅
SelectionChanged事件,以避免内存泄漏。
- 取消订阅
- 当行为从
6. 处理选中项变化(OnSelectionChanged)
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectedItems =
new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>(
)
)
;
}
OnSelectionChanged:- 当
ListView的选中项发生变化时,此方法会被触发。 AssociatedObject.SelectedItems:- 获取
ListView当前选中的项目集合。
- 获取
Cast<SchemeItem>():- 将选中的项目集合转换为
SchemeItem类型的集合。
- 将选中的项目集合转换为
new ObservableCollection<SchemeItem>(...):- 创建一个新的
ObservableCollection<SchemeItem>实例,并将其赋值给SelectedItems属性。 - 这样,
SelectedItems属性会实时更新,反映当前ListView的选中项。
- 创建一个新的
- 当
总结
SelectedItemsBehavior类的作用是:
- 扩展
ListView的功能:- 通过行为机制,为
ListView添加了对多选项目的支持,并将其与视图模型中的ObservableCollection<SchemeItem>属性进行双向绑定。
- 通过行为机制,为
- 自动更新选中项:
- 当用户在
ListView中选择或取消选择项目时,SelectedItems属性会自动更新,确保视图模型中的数据与用户界面保持一致。
- 当用户在
通过在XAML中使用<behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>,可以将ListView的选中项与视图模型中的SelectedSchemeItems属性绑定,实现数据的双向同步。
浙公网安备 33010602011771号