代码之家  ›  专栏  ›  技术社区  ›  falukky

选定时扩展ListViewItem

  •  -1
  • falukky  · 技术社区  · 6 年前

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

    当我选择我的 列表视图项 ,此项变大,以便显示其他元素。

    现在我想实现一个行为,在每次单击 列表视图项 此项目将从“选定”更改为“未选定”,因此每次单击“我的” 列表视图项 将其高度更改为 50 再次点击返回 22 (默认大小)。

    我订阅了 PreviewMouseLeftButtonDown event :

    private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    
    }
    

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   mm8    6 年前

    你可以处理 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 ,需要将代码隐藏文件添加到 字典资源 . 这是一件容易的事情:

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

    另一种选择是定义 风格 事件设置器 在视图中内联并基于 风格 MultiDataTrigger 您在中定义的 字典资源 :

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