ContextMenuItem isEnabled 绑定到对象 属性

ContextMenuItem isEnabled binding to Object property

我在树视图中声明了一个用于 TreeView 项的上下文菜单:

<TreeView  ItemsSource="{Binding countries, Mode=TwoWay}" SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type myapp:City}"  ItemsSource="{Binding Cities}">
            <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource CityItem}">
                <TextBlock Text="{Binding CityName}" FontSize="14" Foreground="Bisque"/>
                ...

上下文菜单本身声明为:

<ContextMenu x:Key ="CityItem"  StaysOpen="true" Foreground="Bisque">
    <MenuItem Header="Edit City"  CommandParameter="{Binding Parent, RelativeSource={RelativeSource Self}}" Click="EditCityClick"/>
    <MenuItem Header="DeleteCity" CommandParameter="{Binding Parent, RelativeSource={RelativeSource Self}}" Click="DeleteCityClick"/>
</ContextMenu>

嗯,此时一切正常

private void DeleteCityClick(object sender, RoutedEventArgs e)
{
    City city = ((FrameworkElement)e.OriginalSource).DataContext as City;
        ...
}

我可以访问城市对象,修改,删除,以及根据城市和城市属性的变化在 gui 中更新的所有内容(属性changed 工作正常)。

问题是如何禁用 ContextMenuItem 绑定 IsEnabled 到 City 对象 属性?比方说

public bool IsEnabled { get; set;}

我尝试了几种方法,但不知道如何从 ContextMenu MenuItem 访问源对象(城市)。

谢谢!

已编辑:很抱歉打字错误但是:

public string IsEnabled { get; set;}

实际是:

public bool IsEnabled { get; set;}

编辑 2:

有趣"not a wpf..."

我认为您的问题是,ContextMenu 在资源中。所以你可以使用 PlacementTarget 来绑定它。

<ContextMenu x:Key ="CityItem" IsEnabled="{Binding PlacementTarget.DataContext.IsEnabled, RelativeSource={RelativeSource Self}}">

试试这个:

<MenuItem ... IsEnabled="{Binding PlacementTarget.DataContext.IsEnabled, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />

它绑定到父 ContextMenuPlacementTargetDataContext,它应该是一个 City 对象。