ContextMenu基于对象绑定wpf

时间:2017-06-30 15:38:28

标签: c# wpf contextmenu

所以我有一个列表视图,显示帖子项目(交付日期,类型,跟踪号等),我有一个上下文菜单设置,可以打开跟踪网站或将跟踪号码复制到剪贴板。

我想要的是上下文菜单只出现在具有跟踪号的列表项中。我已经想到了改变上下文菜单的可见性,但它是跟踪号码的绑定我遇到了麻烦。

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

这就是我目前所拥有的。

2 个答案:

答案 0 :(得分:0)

这似乎是一个触发器的情况:

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

答案 1 :(得分:0)

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

(我不知道您的跟踪号是什么类型,因此您可以进行自己的逻辑检查,以确定它是否“有”有效的跟踪号码)