Ori*_*pax 5 wpf treeview contextmenu
我需要在WPF应用程序中使用树视图控件我创建嵌套数据(类型为DataItem)并将其分配给treeview控件.创建hierarchydatatemplate并将其分配给treeview控件向treeview添加一个contextmenu,现在我想通过SelectedItem的一个属性禁用或启用菜单项(我认为它应该是DataItem),"IsEnabled"
怎么接近?
<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;
}
Run Code Online (Sandbox Code Playgroud)
我通过以下方法解决了这个问题.
创建上下文菜单资源
<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>
Run Code Online (Sandbox Code Playgroud)为树视图项创建样式并使用上面的上下文菜单资源
<Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1">
<Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}">
</Setter>
...
</Style>
Run Code Online (Sandbox Code Playgroud)实现转换器.根据上面的标记扩展,传入convert的parmeter是当前选中的项目,因此我可以获取它的属性并进行检查.
感谢您所有的帮助.
小智 1
我已经在 WinForm TreeView 中使用了它,并取得了成功的结果。
声明 DataItems 时还包含一个标记属性。
DataItem i1 = new DataItem() { Name = "Test1",
Category = 1, IsEnabled = false, Tag = "Test1" };
Run Code Online (Sandbox Code Playgroud)
在 TreeView 的 EventListener 上,转换发送者对象或从 TreeView 获取 SelectedItem。
//It is only Algorithm:
if treeview1.selecedItem.Tag = "Test1" then
//code for execution
end if
Run Code Online (Sandbox Code Playgroud)
类似地,对于发送者对象,
//It is only Algorithm:
variable treeNode = cast ( sender to TreeView ).SelectedItem
if treeNode.Tag = "Test1" then
//code for execution
end if
Run Code Online (Sandbox Code Playgroud)
至于“执行代码”,您可以启用或禁用菜单项。
注意:您尚未在 ContextMenu 标记中为 MenuItems 声明 x:Name 属性。请执行此操作以访问菜单项。
IsEnabled 是 WPF 中用于启用或禁用可交互项的直接属性
我只是给出了算法,因为我更喜欢 VB,而不是 C#。所以我不想弄乱代码。
祝你有美好的一天 :)