【问题标题】:Disable treeview root node when using hierarchicaldatatemplate使用分层数据模板时禁用树视图根节点
【发布时间】:2013-04-16 17:09:07
【问题描述】:

我使用 WPF/MVVM 来玩弄一个树视图控件

<TreeView HorizontalAlignment="Left" 
                  Height="319" 
                  VerticalAlignment="Top" 
                  Width="517"
                  ItemsSource="{Binding Tree}"
                  >
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal">
                        <Button Width="100" Height="20" IsEnabled="{Binding IsEnabled}" Content="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

这是我的带有节点类的视图模型

public partial class MainWindow : Window
    {
        class TreeNode
        {
            public string Name { get; set; }
            public bool IsEnabled { get; set; }
            public List<TreeNode> Children { get; set; }
            public TreeNode()
            {
                Children = new List<TreeNode>();
                IsEnabled = true;
            }
        }

        class ViewModel
        {
            public List<TreeNode> Tree { get; private set; }
            public ViewModel()
            {
                Tree = new List<TreeNode>();
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            var viewModel = new ViewModel
                {
                    Tree =
                        {
                            new TreeNode
                                {
                                    Name = "Root 1",
                                    IsEnabled = false,
                                    Children = {
                                        new TreeNode { Name = "Child 1" },
                                        new TreeNode { Name = "Child 2" },
                                        new TreeNode { Name = "Child 3", 
                                            Children =
                                                {
                                                    new TreeNode { Name = "Child 3-1" },
                                                    new TreeNode { Name = "Child 3-2" },
                                                    new TreeNode { Name = "Child 3-3" }, 
                                                }
                                        },
                                    }
                                }
                        }
                };

            DataContext = viewModel;
        }
    }

如您所见,我将属性“IsEnabled”绑定到按钮,这一切都很好,但我实际上想将“IsEnabled”属性绑定到实际的根节点元素,而不是节点内的对象。

我需要怎么做才能根据这个属性值禁用整个根节点?

【问题讨论】:

    标签: wpf mvvm treeview hierarchicaldatatemplate


    【解决方案1】:

    为此,您实际上需要为TreeView 影响ItemContainerStyle。这会设置为 Tree 的每个节点生成的 ItemContainer (TreeViewItem) 的样式。

    <TreeView HorizontalAlignment="Left" Height="319" VerticalAlignment="Top" Width="517" ItemsSource="{Binding Tree}">
        <TreeView.ItemTemplate>
            <!-- Leave this the same, except for the IsEnabled binding on the button -->
        </TreeView.ItemTemplate>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
    

    【讨论】:

    • 谢谢!我正在吠叫那棵树,但以错误的方式实施它,感谢您向我展示了正确的方法:)
    • 没问题,很高兴为您提供帮助。我经常在ItemTemplatesItemContainerStyles 之间感到困惑,哪个是用来做什么的!有时只需要一个快速提醒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多