Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> связать свойство isChecked у чекбоксов 
V
    Опции темы
hexzo
Дата 31.5.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



http://s1.ipicture.ru/uploads/20110531/ziIWWVDR.bmp

Иерархический список чекбоксов рисуется вот таким шаблоном.

Код

   <TreeView Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="treeView1" VerticalAlignment="Top" Width="210" ItemsSource="{Binding Source={x:Static Member=src:element.get_hierarchy}}">
      <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type src:element}" ItemsSource="{Binding Path=childs}">
          <CheckBox Content="{Binding Path=name}"/>          
        </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>


Как бы забиндить свойства IsChecked у флажков со всеми флажками чекбоксов которые лежат ниже по иерархии. То есть что бы одним щелчком можно было выделить целую ветвь.

P.S. движок картинку вставлять не хочет.

Это сообщение отредактировал(а) hexzo - 31.5.2011, 11:27
PM MAIL   Вверх
SergeyLoginov
Дата 31.5.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



Я так понимаю, что надо привязываться к булевскому свойству контекста данных (узел дерева). Это свойство надо реализовать. И при изменении его изменять значение этого же свойства у дочерних элементов. Это судя по всему стоит делать в коде.
PM MAIL   Вверх
hexzo
Дата 31.5.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



SergeyLoginov
Цитата
И при изменении его изменять значение этого же свойства у дочерних элементов.

Но чекбокс кажется ничего не знает ни о каких иерархиях.

В TreeViewItem есть свойство Header, которое указывает на элемент выше по иерархии. А вот как к нему, в моём примере с шаблоном, событие привязать?
 smile 

Это сообщение отредактировал(а) hexzo - 31.5.2011, 14:27
PM MAIL   Вверх
SergeyLoginov
Дата 1.6.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



Ну как же. 
Код

<CheckBox Content="{Binding Path=name}"/>

Здесь же осуществляется привязка к свойству name. Это свойство контекста данных - узла дерева. Типа такого:
Код

public class TreeNode : System.ComponentModel.INotifyPropertyChanged
    {
        private System.Collections.ObjectModel.ObservableCollection<TreeNode> children = new System.Collections.ObjectModel.ObservableCollection<TreeNode>();
        private string name;
        /// <summary>
        /// Дочерние узлы
        /// </summary>
        public System.Collections.ObjectModel.ObservableCollection<TreeNode> Children
        {
            get { return children; }             
        }      
        /// <summary>
        /// Имя узла
        /// </summary>
        public string Name
        {
            get { return name; }
            set 
            { 
                name = value;
                OnPropertyChanged("Name");
            }
        }
        private bool _checked = false;

        /// <summary>
        /// Помечен ли узел галочкой комбобокса
        /// </summary>
        public bool Checked
        {
            get { return _checked; }
            set 
            {
                _checked = value;
                foreach (var child in Children)
                {
                    child.Checked = _checked;
                }
                OnPropertyChanged("Checked");
            }
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="name"></param>
        public TreeNode(string name)
        {
            Name = name;
        }

        #region INotifyPropertyChanged Members
        /// <summary>
        /// Событие на изменение свойства
        /// </summary>
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Уведомление об изменении свойства (все объекты представления привязаные к этому свойству автоматически обновят себя)
        /// </summary>
        /// <param name="propertyName">Имя свойства принимающего новое значение</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }


Только Name с большой буквы. А чтобы было как Вы хотите, надо чтобы xaml выглядел примерно так:
Код

<TreeView Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="treeView1" VerticalAlignment="Top" Width="210" ItemsSource="{Binding MyNodes}}">
      <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type src:TreeNode}" ItemsSource="{Binding Path=Children}">
          <CheckBox Content="{Binding Path=Name}" IsChecked={Binding Checked}/>          
        </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>


MyNodes - список узлов первого уровня дерева. 
P.S. Код не проверял, могут быть неточности. Но смысл такой.
PM MAIL   Вверх
hexzo
Дата 2.6.2011, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Аааааа, ясно.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.