选中时扩展 ListViewItem

Extend ListViewItem when selected

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

}

我的问题是:我需要在这个事件处理程序中写入什么?

您可以处理 ListViewItem 容器的 PreviewMouseLeftButtonDown 事件:

<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;
    }
}

I put this EventSetter after my Style (this style is in another file) and got this: 'ResourceDictionary' root element requires a x:Class attribute to support event handlers in the XAML file ...

如果在 ResourceDictionary 中定义 ItemContainerStyle,则需要向 ResourceDictionary 添加代码隐藏文件。这很容易做到:

Is it possible to set code behind a resource dictionary in WPF for event handling?

另一种选择是在您的视图中使用 EventSetter 内联定义 Style 并将其基于您定义的 StyleMultiDataTriggerResourceDictionary:

<ListView x:Name="listView">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem" BasedOn="{StaticResource YourOtherStyleInTheResourceDictionary}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>