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

时间:2019-04-14 13:09:44

标签: c# wpf listview gridview listviewitem

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

我想在列表视图中的项目上添加双击功能,发现可以通过更改ListViewItem的样式来实现。但是,这覆盖了我的MaterialDesign主题的默认样式,因此项目变得难看。

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

也许会有更好的方法将Setter添加到元素的样式中? 设置样式如何改变数据绑定的任何内容?

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

我期望的是一个看起来像https://i.imgur.com/Z0oORhE.png且可以双击的ListView。

但是我得到的是一个看起来像https://i.imgur.com/6o6SCyW.png且可以双击的ListView。

这是没有BasedOn="{StaticResource {x:Type ListViewItem}}" https://i.imgur.com/OO4Rg2v.png

时的样子

2 个答案:

答案 0 :(得分:0)

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

<ListView MouseDoubleClick="ListView_MouseDoubleClick"

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

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

如果双击标题或分界线,可能必须对hsl进行空检查以免发生不良情况。

答案 1 :(得分:0)

您应该基于MaterialDesignGridViewItem资源来创建样式:

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