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