我是WPF的新手,我有一个绑定列表视图使用gridview来显示对象及其属性的列表。我的整个项目使用MaterialDesign中的自定义样式,它为所有内容提供了一个黑暗的主题。
我想为listview中的项添加双击功能,我发现我可以通过更改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>
我所期待的是一个看起来像这个https://i.imgur.com/Z0oORhE.png的ListView并且已经工作了doubleclick。
但我得到的是一个ListView,看起来像这个https://i.imgur.com/6o6SCyW.png并且工作doubleclick。
这就是没有BasedOn="{StaticResource {x:Type ListViewItem}}"
https://i.imgur.com/OO4Rg2v.png的样子
您应该将您的风格基于MaterialDesignGridViewItem
资源:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignGridViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="HitsoundLayer_MouseDoubleClick"/>
</Style>
</ListView.ItemContainerStyle>
您可以将moused双击处理程序添加到列表视图本身。
<ListView MouseDoubleClick="ListView_MouseDoubleClick"
并获取对该行的datacontext的引用:
void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var hsl = ((FrameworkElement)e.OriginalSource).DataContext as HitSoundLayer;
如果双击标题或分隔线,您可能必须null检查hsl以避免不良内容。