【发布时间】:2017-07-21 07:14:28
【问题描述】:
我有一个在树视图中声明的树视图项目的 ContextMenu:
<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 本身声明为:
<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 中更新所有内容(onpropertychanged 工作正常)。
问题是如何禁用 ContextMenuItem 绑定 IsEnabled 到 City 对象属性?比方说
public bool IsEnabled { get; set;}
我尝试了几种方法,但不知道如何从 ContextMenu MenuItem 访问源对象(城市)。
谢谢!
已编辑:抱歉打错了,但是:
public string IsEnabled { get; set;}
其实是:
public bool IsEnabled { get; set;}
编辑 2:
有趣的“不是 wpf...”
【问题讨论】:
-
如果我没记错的话,你为什么不能简单地使用树视图的
SelectedNode?如果打开上下文菜单并单击其中一个选项,则SelectedNode转换为City应该可以满足您的需求。 (而且你不需要使用 CommandParameter) -
其实我可能是错的,可以在不选择 TreeView 的情况下右键单击一个节点(我习惯于数据网格,这是不可能的)。看看at this link,它适用于 winforms,但转换为 WPF 应该没有那么困难。
-
对不起,也许我没有解释...我访问 City 对象没有问题...我想要将 City 对象的 Isenabled 属性绑定到MenuItem,不知道怎么绑定
标签: c# wpf data-binding contextmenu