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}}" />
它绑定到父 ContextMenu
的 PlacementTarget
的 DataContext
,它应该是一个 City
对象。
我在树视图中声明了一个用于 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}}" />
它绑定到父 ContextMenu
的 PlacementTarget
的 DataContext
,它应该是一个 City
对象。