WPF Listview:检测何时选择listviewitem然后检查它
WPF Listview: Detect when listviewitem is selected and then check it
我有以下列表视图:
<ListView Margin="10" Name="lvUsers" AlternationCount="2" SelectionMode="Extended">
<ListView.View>
<GridView>
<!-- Checkbox header -->
<GridViewColumn>
<GridViewColumn.Header>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" />
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
<!-- SELECTED ITEM EVENT -->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_MouseLeftButtonDown" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
和 code-behind 事件:
private void ListViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var item = sender as ListViewItem;
if (item != null && item.IsSelected)
{
//Do your stuff
}
}
这是数据模型:
public class User : INotifyPropertyChanged
{
private bool isChecked = false;
private string name = string.Empty;
private int age = 0;
private string mail = string.Empty;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public bool IsChecked {
get
{
return this.isChecked;
}
set
{
if (value != this.isChecked)
{
this.isChecked = value;
NotifyPropertyChanged("IsSelected");
}
}
}
public string Name
{
get
{
return this.name;
}
set
{
if (value != this.name)
{
this.name = value;
NotifyPropertyChanged("Name");
}
}
}
public int Age {
get
{
return this.age;
}
set
{
if (value != this.age)
{
this.age = value;
NotifyPropertyChanged("Age");
}
}
}
public string Mail {
get
{
return this.mail;
}
set
{
if (value != this.mail)
{
this.mail = value;
NotifyPropertyChanged("Mail");
}
}
}
}
我在列表视图中有一个复选框 header 并且每个列表视图项目都有一个复选框。
我正在尝试检测何时选择了 listviewitem,然后在选择后我想将其标记为已选中。 Listviewitem 事件 PreviewMouseLeftButtonDown 不起作用,触发时 item.IsSelected 为 false,因为它是在按下鼠标左键之前的预览。没有 MouseClick 事件,只有 MouseDoubleClick。
此外,单击 listviewitem 后,我想将选中的项目标记为已选中(已选中复选框)。
我该怎么做?
在 ListViewItem 样式中绑定 IsSelected
属性:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsChecked}"/>
</Style>
</ListView.ItemContainerStyle>
请注意,为避免 属性 名称出现印刷错误,您可以使用 CallerMemberName
属性,这会使编译器生成正确的 属性 名称:
using System.Runtime.CompilerServices;
...
private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
NotifyPropertyChanged();
}
}
我有以下列表视图:
<ListView Margin="10" Name="lvUsers" AlternationCount="2" SelectionMode="Extended">
<ListView.View>
<GridView>
<!-- Checkbox header -->
<GridViewColumn>
<GridViewColumn.Header>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" />
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
<!-- SELECTED ITEM EVENT -->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_MouseLeftButtonDown" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
和 code-behind 事件:
private void ListViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var item = sender as ListViewItem;
if (item != null && item.IsSelected)
{
//Do your stuff
}
}
这是数据模型:
public class User : INotifyPropertyChanged
{
private bool isChecked = false;
private string name = string.Empty;
private int age = 0;
private string mail = string.Empty;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public bool IsChecked {
get
{
return this.isChecked;
}
set
{
if (value != this.isChecked)
{
this.isChecked = value;
NotifyPropertyChanged("IsSelected");
}
}
}
public string Name
{
get
{
return this.name;
}
set
{
if (value != this.name)
{
this.name = value;
NotifyPropertyChanged("Name");
}
}
}
public int Age {
get
{
return this.age;
}
set
{
if (value != this.age)
{
this.age = value;
NotifyPropertyChanged("Age");
}
}
}
public string Mail {
get
{
return this.mail;
}
set
{
if (value != this.mail)
{
this.mail = value;
NotifyPropertyChanged("Mail");
}
}
}
}
我在列表视图中有一个复选框 header 并且每个列表视图项目都有一个复选框。
我正在尝试检测何时选择了 listviewitem,然后在选择后我想将其标记为已选中。 Listviewitem 事件 PreviewMouseLeftButtonDown 不起作用,触发时 item.IsSelected 为 false,因为它是在按下鼠标左键之前的预览。没有 MouseClick 事件,只有 MouseDoubleClick。
此外,单击 listviewitem 后,我想将选中的项目标记为已选中(已选中复选框)。
我该怎么做?
在 ListViewItem 样式中绑定 IsSelected
属性:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsChecked}"/>
</Style>
</ListView.ItemContainerStyle>
请注意,为避免 属性 名称出现印刷错误,您可以使用 CallerMemberName
属性,这会使编译器生成正确的 属性 名称:
using System.Runtime.CompilerServices;
...
private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
NotifyPropertyChanged();
}
}