选中时扩展ListViewItem

时间:2018-07-18 08:00:05

标签: wpf listview triggers listviewitem

我有这个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)
{

}

我的问题是:我需要写什么给该事件处理程序?

1 个答案:

答案 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