2017-02-16 5 views
1

Скажут, у меня есть TreeView связывания источника элементов (наблюдаемая коллекция), и у меня есть что-то вроде этого: http://docs.telerik.com/devtools/wpf/controls/radtreeview/how-to/howto-tri-state-mvvmМОФА/Telerik-TreeView с checkbox- дочернего узлом является экранным только тогда, когда родитель проверяется

и каждый товар включая родительский вид имеет флажок и имя (строка).

Я хотел бы сделать дочерние узлы доступными только в том случае, если установлен родительский элемент.

И если родитель не установлен, все дочерние узлы также будут сняты.

есть ли способ, которым я мог бы это достичь? благодаря!

+0

Это не поддерживается самим контролем, так что вам нужно писать логику в коде. – Spawn

ответ

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; 
    } 
Смежные вопросы