【问题标题】:wpf/telerik-treeview with checkbox- child node are availble only when parent is checked带有复选框的 wpf/telerik-treeview-子节点仅在选中父节点时可用
【发布时间】:2017-07-04 23:13:37
【问题描述】:

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

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

我想让子节点仅在选中父节点时才可用。

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

有没有办法实现这一点?谢谢!

【问题讨论】:

  • 控件本身不支持,需要在代码中编写逻辑。

标签: wpf checkbox telerik treeview treeviewitem


【解决方案1】:

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

查看

<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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2012-06-19
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多