<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
属性绑定,实现数据的双向同步。