Wpf 如何为treeview的selecteditem启用/禁用menuitem(在contextmenu中)
我需要在WPF应用程序中使用treeview控件 我创建嵌套数据(类型为DataItem)并将其分配给treeview控件。 创建HierarchycalDataTemplate并将其分配给treeview控件 将上下文菜单添加到treeview, 现在,我想通过SelectedItem的一个属性“IsEnabled”来禁用或启用菜单项(我想应该是DataItem) 如何做到这一点Wpf 如何为treeview的selecteditem启用/禁用menuitem(在contextmenu中),wpf,treeview,contextmenu,Wpf,Treeview,Contextmenu,我需要在WPF应用程序中使用treeview控件 我创建嵌套数据(类型为DataItem)并将其分配给treeview控件。 创建HierarchycalDataTemplate并将其分配给treeview控件 将上下文菜单添加到treeview, 现在,我想通过SelectedItem的一个属性“IsEnabled”来禁用或启用菜单项(我想应该是DataItem) 如何做到这一点 <HierarchicalDataTemplate x:Key="dt" Items
<HierarchicalDataTemplate x:Key="dt" ItemsSource="{Binding Items}">
<TextBlock x:Uid="TextBlock_2" Text="{Binding Name}">
</TextBlock>
</HierarchicalDataTemplate>
<TreeView x:Name="tree_3" Height="200"
ItemTemplate="{StaticResource dt}"
>
<TreeView.ContextMenu>
<ContextMenu>
<MenuItem ItemsSource="{Binding SelectedItem}"
Header="doA" IsEnabled="{Binding IsEnabled, Mode=OneWay}" />
<MenuItem Header="doB" IsEnabled="False"/>
<MenuItem Header="doC" />
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
class DataItem : DependencyObject //INotifyPropertyChanged
{
private List<DataItem> _items = new List<DataItem>();
public List<DataItem> Items
{
get
{
return _items;
}
}
public string Name { get; set; }
public int Category { get; set; }
public bool IsEnabled { get; set; }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<DataItem> allData = new List<DataItem>();
DataItem i1 = new DataItem() { Name = "Test1", Category = 1, IsEnabled = false };
DataItem i2 = new DataItem() { Name = "Test2", Category = 2, IsEnabled = false };
DataItem i3 = new DataItem() { Name = "Test3", Category = 3, IsEnabled = true };
DataItem t1 = new DataItem() { Name = "Template 1", Category = 1, IsEnabled = true };
DataItem t2 = new DataItem() { Name = "Template 2", Category = 1, IsEnabled = false };
i1.Items.Add(t1);
i1.Items.Add(t2);
allData.Add(i1);
allData.Add(i2);
allData.Add(i3);
tree_3.ItemsSource = allData;
}
类DataItem:DependencyObject//INotifyPropertyChanged
{
私有列表_items=新列表();
公共清单项目
{
得到
{
退货(物品);;
}
}
公共字符串名称{get;set;}
公共int类{get;set;}
公共布尔值已启用{get;set;}
}
已加载私有无效窗口(对象发送器、路由目标)
{
List allData=新列表();
DataItem i1=newDataItem(){Name=“Test1”,Category=1,IsEnabled=false};
DataItem i2=newdataitem(){Name=“Test2”,Category=2,IsEnabled=false};
DataItem i3=newDataItem(){Name=“Test3”,Category=3,IsEnabled=true};
DataItem t1=newDataItem(){Name=“Template 1”,Category=1,IsEnabled=true};
DataItem t2=newdataitem(){Name=“Template 2”,Category=1,IsEnabled=false};
i1.增加项目(t1);
i1.增加项目(t2);
添加(i1);
添加(i2);
添加(i3);
tree_3.ItemsSource=所有数据;
}
我用下面的方法解决了这个问题
<ContextMenu x:Uid="ContextMenu_1" x:Key="TreeViewItemContextMenu"
ItemsSource="{Binding}">
<MenuItem x:Uid="MenuItem_1"
Header="Rename"
IsEnabled="{Binding Path=., Converter={StaticResource renameMenuConverter}}"
Click="RenameMenu_OnClick"
/>
</ContextMenu>
<Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1">
<Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}">
</Setter>
...
</Style>
...
谢谢你的帮助 我已经在WinForm TreeView中使用了它,并取得了成功 声明数据项时,其中还包含标记属性
DataItem i1 = new DataItem() { Name = "Test1",
Category = 1, IsEnabled = false, Tag = "Test1" };
在树视图的EventListener上,强制转换sender对象或从树视图获取SelectedItem
//It is only Algorithm:
if treeview1.selecedItem.Tag = "Test1" then
//code for execution
end if
同样,对于发送方对象
//It is only Algorithm:
variable treeNode = cast ( sender to TreeView ).SelectedItem
if treeNode.Tag = "Test1" then
//code for execution
end if
至于“执行代码”,您可以启用或禁用菜单项
注意:您尚未在ContextMenu标记中声明MenuItems的x:Name属性。
请执行此操作以访问菜单项
IsEnabled是用于启用或禁用WPF中可交互项的直接属性
我之所以给出这个算法,是因为我更喜欢VB而不是C。所以我不想把代码弄乱
祝您愉快:)您还可以在Tag属性中添加唯一标识符。您可能会问“我可以使用DataItem的名称来访问它们?”但要做到这一点,您可以将它们全局声明为Friend,或者在设计器代码中使用它。否则,您无法处理该对象。您还可以为DataItems添加一个显式事件侦听器来执行此任务。一如既往,程序员的策略就像树上的分支一样多!