基于对象绑定wpf的ContextMenu
ContextMenu based on object binding wpf
所以我有一个显示 post 项(交货日期、类型、跟踪号等)的列表视图,并且我设置了一个上下文菜单,可以打开跟踪网站或将跟踪号复制到剪贴板。
我想要的是上下文菜单仅针对具有跟踪编号的列表项显示。我有改变上下文菜单可见性的想法,但它是我遇到麻烦的跟踪号码的绑定。
<ContextMenu x:Key="MyElementMenu">
<MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem>
<MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem>
</ContextMenu>
<!--Sets a context menu for each ListBoxItem in the current ListBox-->
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
</Style>
这是我目前拥有的。
这似乎是触发条件:
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
<Style.Triggers>
<!--
Maybe the tracking number property is called something else, maybe it's 0
instead of null when absent. You didn't say.
-->
<DataTrigger Binding="{Binding TrackingNumber}" Value="{x:Null}">
<Setter Property="ContextMenu" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<MyControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
</MyControl.Resources>
<!--Sets a context menu for each ListBoxItem in the current ListBox-->
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu IsEnabled="{Binding HasTrackingNumber}" Visibility="{Binding HasTrackingNumber, Converter={StaticResource BoolToVis}">
<MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem>
<MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
这应该能满足您的需求。不确定您是否在其他地方使用 ContextMenu,但如果您不这样做,您总是可以将其设置为 ListViewItem 样式的样式。然后你不需要从其他地方引用它。无论哪种方式,它更多的是关于从项目添加绑定。在您的 ListItem Viewmodel 中,您可以添加如下内容:
public bool HasTrackingNumber => TrackingNumber == 0 || TrackingNumber == null;
(我不知道您的跟踪号是什么类型,因此您可以自己进行逻辑检查以了解它是否 "has" 有效的跟踪号)
所以我有一个显示 post 项(交货日期、类型、跟踪号等)的列表视图,并且我设置了一个上下文菜单,可以打开跟踪网站或将跟踪号复制到剪贴板。
我想要的是上下文菜单仅针对具有跟踪编号的列表项显示。我有改变上下文菜单可见性的想法,但它是我遇到麻烦的跟踪号码的绑定。
<ContextMenu x:Key="MyElementMenu">
<MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem>
<MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem>
</ContextMenu>
<!--Sets a context menu for each ListBoxItem in the current ListBox-->
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
</Style>
这是我目前拥有的。
这似乎是触发条件:
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
<Style.Triggers>
<!--
Maybe the tracking number property is called something else, maybe it's 0
instead of null when absent. You didn't say.
-->
<DataTrigger Binding="{Binding TrackingNumber}" Value="{x:Null}">
<Setter Property="ContextMenu" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<MyControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
</MyControl.Resources>
<!--Sets a context menu for each ListBoxItem in the current ListBox-->
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu IsEnabled="{Binding HasTrackingNumber}" Visibility="{Binding HasTrackingNumber, Converter={StaticResource BoolToVis}">
<MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem>
<MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
这应该能满足您的需求。不确定您是否在其他地方使用 ContextMenu,但如果您不这样做,您总是可以将其设置为 ListViewItem 样式的样式。然后你不需要从其他地方引用它。无论哪种方式,它更多的是关于从项目添加绑定。在您的 ListItem Viewmodel 中,您可以添加如下内容:
public bool HasTrackingNumber => TrackingNumber == 0 || TrackingNumber == null;
(我不知道您的跟踪号是什么类型,因此您可以自己进行逻辑检查以了解它是否 "has" 有效的跟踪号)