当前位置: 首页 > 知识库问答 >
问题:

wpf/telerik treeview with checkbox-仅当选中父节点时,子节点才可用

夏侯博
2023-03-14

假设我有一个绑定项目源(可观察集合)的TreeView,我有这样的东西:http://docs.telerik.com/devtools/wpf/controls/radtreeview/how-to/howto-tri-state-mvvm

每个项目包括父视图都有一个复选框和名称(字符串)。

我想让子节点仅在检查父节点时可用。

如果父节点未被选中,所有子节点也将被取消选中。

有没有办法让我做到这一点?谢谢!

共有1个答案

马侯林
2023-03-14

无法检查链接,但是,这是一个工作示例,我认为您应该遵循以下结构:

查看

<Grid>
    <TreeView DataContext="{Binding}" ItemsSource="{Binding Models}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:ModelView}" ItemsSource="{Binding Models}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                    <CheckBox IsChecked="{Binding IsChecked}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid> 

模型

public class Model : INotifyPropertyChanged
{
    bool _isChecked;
    public bool IsChecked { get { return _isChecked; } set {
            _isChecked = value;
            RaisePropertyChanged("IsChecked");
            if (_isChecked == false)
                unCheckOthers();
        } }
    void unCheckOthers()
    {
        if (_models != null)
            foreach (var m in _models)
                m.IsChecked = false;
    }

    Model[] _models;
    public Model[] Models { get { return _models; } set { _models = value; RaisePropertyChanged("Models"); } }

    string _name;
    public string Name { get { return _name; } set { _name = value; RaisePropertyChanged("Name"); } }

    public event PropertyChangedEventHandler PropertyChanged;
    void RaisePropertyChanged(string propname)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname));
    }
}

查看模型

public class ViewModel
{
    public ViewModel()
    {
        _models = new ObservableCollection<Model>();
    }
    ObservableCollection<Model> _models;
    public ObservableCollection<Model> Models { get { return _models; } set { _models = value; } }
}

主窗口

    public MainWindow()
    {
        InitializeComponent();

        ViewModel mv = new ViewModel();
        Model m1 = new Model() { Name = "model1", IsChecked = true, Desc = "None1" };
        Model m2 = new Model() { Name = "model2", IsChecked = true, Desc = "None2" };
        Model m3 = new Model() { Name = "model3", IsChecked = true, Desc = "None3" };
        Model m4 = new Model() { Name = "model4", IsChecked = true, Desc = "None4", Models = new Model[2] {m1,m2} };
        Model m5 = new Model() { Name = "model5", IsChecked = true, Desc = "None5", Models = new Model[2] { m4, m3 } };
        mv.Models = new ObservableCollection<Model>() { m5 };
        this.DataContext = mv;
    }
 类似资料:
  • 我正在尝试用multiselect实现一个自定义的。由于我的原因,我不能使用现有的解决方案。 我的问题是:我有一个,其中一些子项被禁用。有时,当我单击启用的节点,然后单击禁用的节点时,父节点会被选中。 我想摆脱这种默认的选择行为,因为我的treeview中的所有项目都有一个数据库属性,我在实际点击项目时设置了这个属性,我不希望treeview自己选择一些项目! 更新:我需要处理对禁用项目的单击,因

  • element ui 树状表格选择父节点子节点全选,子节点不全选父节点半选? el-table没有相关示例,需要手动实现好像?![上传中...]()

  • element ui 树状表格选择父节点子节点全选,子节点不全选父节点半选? el-table没有相关示例,需要手动实现好像?

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 我想从父节点复制到子节点。我真的不确定这是如何实现的。 我的源xml 我想得到输出为 我想要XSLT1.0中的解决方案。 我想将这些节点复制到子节点 谢谢。