我有这个ListViewItem
触发器:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Background" Value="White"/>
<Setter Property="Height" Value="50"/>
</MultiDataTrigger>
当我选择ListViewItem
时,此项会变大,因此我可以显示其他元素。
现在,我要实现一种行为,即每次单击ListViewItem
后,此项都会从选中更改为未选中,因此,每次单击后,我的ListViewItem
的高度都会更改为50
然后再次单击返回22
(默认大小)。
我订阅了PreviewMouseLeftButtonDown
event
:
private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
}
我的问题是:我需要写什么给该事件处理程序?
答案 0 :(得分:1)
您可以为PreviewMouseLeftButtonDown
容器处理ListViewItem
事件:
<ListView x:Name="listView">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
<Style.Triggers>
<MultiDataTrigger>
...
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
...类似这样的东西:
private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListViewItem lvi = (ListViewItem)sender;
if (lvi.IsSelected)
{
listView.SelectedItems.Remove(lvi.DataContext);
e.Handled = true;
}
}
我将此
EventSetter
放在我的Style
之后(此样式在另一个文件中)并得到以下信息:'ResourceDictionary'根元素需要一个x:Class
属性以支持XAML中的事件处理程序文件...
如果在ItemContainerStyle
中定义ResourceDictionary
,则需要在ResourceDictionary
中添加一个代码隐藏文件。这是一件容易的事:
Is it possible to set code behind a resource dictionary in WPF for event handling?
另一种选择是在视图中以Style
内联定义EventSetter
,并以Style
为基础,并在{ MultiDataTrigger
:
ResourceDictionary