Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何为treeview的selecteditem启用/禁用menuitem(在contextmenu中)_Wpf_Treeview_Contextmenu - Fatal编程技术网

Wpf 如何为treeview的selecteditem启用/禁用menuitem(在contextmenu中)

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

我需要在WPF应用程序中使用treeview控件 我创建嵌套数据(类型为DataItem)并将其分配给treeview控件。 创建HierarchycalDataTemplate并将其分配给treeview控件 将上下文菜单添加到treeview, 现在,我想通过SelectedItem的一个属性“IsEnabled”来禁用或启用菜单项(我想应该是DataItem)

如何做到这一点

            <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>
    
    
    ...
    
  • 实现一个转换器。根据上面的标记扩展,convert中传递的参数是当前选定的项,因此我可以获取它的属性并进行检查


  • 谢谢你的帮助

    我已经在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添加一个显式事件侦听器来执行此任务。一如既往,程序员的策略就像树上的分支一样多!