WPF ListViewItem 样式打破了数据绑定?

WPF ListViewItem style broke the data bindings?

我是 WPF 的新手,我有一个绑定 listview 使用 gridview 来显示对象及其属性的列表。我的整个项目都使用了 MaterialDesign 的自定义样式,它为所有内容提供了 深色主题

我想为 listview 中的项目添加 doubleclick 功能,我发现,我可以通过更改 ListViewItem 的样式来实现。然而,这覆盖了我 MaterialDesign 主题的默认样式,并且项目变得丑陋。

然后我添加了BasedOn="{StaticResource {x:Type ListViewItem}}"来恢复默认样式,但是绑定停止工作并且停止显示对象的属性?

是否有更好的方法将 Setters 添加到元素的样式中? 设置样式如何改变数据绑定?

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}"  BasedOn="{StaticResource {x:Type ListViewItem}}">
        <EventSetter Event="MouseDoubleClick" Handler="HitsoundLayer_MouseDoubleClick"/>
    </Style>
</ListView.ItemContainerStyle>
<ListView.View>
    <GridView>
        <GridViewColumn Header="_Name" Width="120" DisplayMemberBinding="{Binding Name}" />
        <GridViewColumn Header="_Amount" Width="90" DisplayMemberBinding="{Binding Times.Count}" />
        <GridViewColumn Header="_SampleSet" Width="120" DisplayMemberBinding="{Binding SampleSetString}" />
        <GridViewColumn Header="_Hitsound" Width="120" DisplayMemberBinding="{Binding HitsoundString}" />
        <GridViewColumn Header="_Sample Path" Width="1000" DisplayMemberBinding="{Binding SamplePath}" />
    </GridView>
</ListView.View>

我期望的是一个如下所示的 ListView,并且可以双击。

但我得到的是一个 ListView,如下所示 并且可以双击。

这是没有 BasedOn="{StaticResource {x:Type ListViewItem}}"

的样子

您可以将 mousedoubleclick 处理程序添加到列表视图本身。

<ListView MouseDoubleClick="ListView_MouseDoubleClick"

并获取对行的数据上下文的引用:

void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var hsl = ((FrameworkElement)e.OriginalSource).DataContext as HitSoundLayer;

如果双击 header 或分界线,您可能必须空检查 hsl 以避免出现不良情况。

您的风格应该基于 MaterialDesignGridViewItem 资源:

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignGridViewItem}">
        <EventSetter Event="MouseDoubleClick" Handler="HitsoundLayer_MouseDoubleClick"/>
    </Style>
</ListView.ItemContainerStyle>