locked
Как автоматически установить(check) TreeView узлы-потомки когда родительский узел установлен(checked)? RRS feed

  • Общие обсуждения

  • Можно использовать присвоение данных для этого. Создать класс содержащий булевые(boolean) свойства, которые будут привзяаны к  CheckedBox's IsChecked свойству и свойства коллекции(collection property), которые будут привязаны к TreeViewItem узлам–потомкам. Когда TreeViewItem CheckBox положение изменится, его узлы-потомки буду установлены(check) свойствами узла потомка. Пример:

    <Window.Resources>
      <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">
          <CheckBox IsChecked="{Binding IsChecked}"/>
          <TextBlock Text="{Binding Text}"/>
        </StackPanel>
      </HierarchicalDataTemplate>
    </Window.Resources>
    <TreeView ItemsSource="{Binding Nodes, ElementName=Window}"/>
    

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.Nodes = new ObservableCollection<Node>()
            {
                new Node(){Text="Node A"},
                new Node(){Text="Node B"},
            };
            this.Nodes[0].Children.Add(new Node() { Text = "Node C" });
            this.Nodes[0].Children.Add(new Node() { Text = "Node D" });
            this.Nodes[1].Children.Add(new Node() { Text = "Node E" });
            this.Nodes[1].Children.Add(new Node() { Text = "Node F" });
            InitializeComponent();
        }
        public ObservableCollection<Node> Nodes { get; private set; }
    }
    
    public class Node : INotifyPropertyChanged
    {
        ObservableCollection<Node> children = new ObservableCollection<Node>();
        string text;
        bool isChecked;
        public ObservableCollection<Node> Children
        {
            get { return this.children; }
        }
        public bool IsChecked
        {
            get { return this.isChecked; }
            set
            {
                this.isChecked = value;
                RaisePropertyChanged("IsChecked");
            }
        }
        public string Text
        {
            get { return this.text; }
            set
            {
                this.text = value;
                RaisePropertyChanged("Text");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            if (propertyName == "IsChecked")
            {
                foreach (Node child in this.Children)
                    child.IsChecked = this.IsChecked;
            }
        }
    }
    
    public class Container : INotifyPropertyChanged
    {
        bool isChecked;
        public bool IsChecked
        {
            get { return this.isChecked; }
            set
            {
                this.isChecked = value;
                RaisePropertyChanged("IsChecked");
            }
        }
        public Node Node { get; set; }
    } 
    



    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 23:03 MSDN Forums consolidation (От:Разработка Windows-приложений)
    17 марта 2010 г. 12:01
    Модератор