Статус:
Offline
Реєстрація: 30.03.2007
Повідом.: 1280
Реєстрація: 30.03.2007
Повідом.: 1280
- 🟢 05:14 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
- #1
WPF TreeView DataBinding дерево не обновляется динамически при обновлении свойств элементов источника
Есть элемент TreeView. В XAML его заголовок выглядит так:
привязанный к коллекции Tasks (ObservableCollection<Task> Tasks) объекта cTask. Режим binding-а я указал TwoWay.
Если я добавляю объекты Task в коллекцию:
в TreeView элементы тоже добавляются, т.к. объект привязки - коллекция Tasks изменяется. Тут все правильно.
Но! Я хочу заменять шаблон отображения текущего выбранно элемента в TreeView. Все элементы представлены в TreeView одним текстовым полем объекта Task, а выбранный элемент должен состоять из этого поля + некоторых других элементов, вобщем к нему должен применяться другой шаблон. Задачу выбора нужного шаблона я решил с помощью селекторов шаблонов
который для элемента Task со значением свйоства IsSelected равным true выбирает специальный шаблон HighlightTemplate, а все остальные отображаются при помощи шаблона DefaultTemplate.
В обработчик события SelectedItemChanged (которое возникает при изменении выбранного элемента) дерева TreeView я написал следующий код:
Надеясь что при изменении свойства конкретного объекта Task из коллекции источника TreeView применит шаблон HighlightTemplate для его отображения, но этого не происходит. Выходит что ItemsColtrol-ы динамически реагируют только на изменение самого объекта привязки и не реагируют на изменение отдельных свойств объекта привязки
Помогите решить проблему, если кто-то понял о чем я.
В случае если в код добавить
tree.Items.Refresh();
или
переподключить ItemsSource дереву:
tree.ItemsSource = null;
tree.ItemsSource = cTask.Tasks;
то дерево будет перерисовано и шаблон отображения для элемента поменяется, но тогда фокус уйдет с выбранного элемента и все ветки дерева свернуться. Мне естественно нужно оставлять элемент выбранным, т.к. именно для него должен будет отображаться спецовый шаблон.
Есть элемент TreeView. В XAML его заголовок выглядит так:
Код:
<TreeView Name="tree" Grid.Row="2" ItemsSource="{Binding cTask, Path=Tasks, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItemChanged="tree_SelectedItemChanged">
привязанный к коллекции Tasks (ObservableCollection<Task> Tasks) объекта cTask. Режим binding-а я указал TwoWay.
Если я добавляю объекты Task в коллекцию:
Код:
cTask.Add(new Task());
в TreeView элементы тоже добавляются, т.к. объект привязки - коллекция Tasks изменяется. Тут все правильно.
Но! Я хочу заменять шаблон отображения текущего выбранно элемента в TreeView. Все элементы представлены в TreeView одним текстовым полем объекта Task, а выбранный элемент должен состоять из этого поля + некоторых других элементов, вобщем к нему должен применяться другой шаблон. Задачу выбора нужного шаблона я решил с помощью селекторов шаблонов
Код:
<TreeView.ItemTemplateSelector>
<local:TaskTemplateSelector
DefaultTemplate="{StaticResource DefaultTemplate}"
HighlightTemplate="{StaticResource HighlightTemplate}"
PropertyToEvaluate="IsSelected"
PropertyValueToHighlight="True">
</local:TaskTemplateSelector>
</TreeView.ItemTemplateSelector>
который для элемента Task со значением свйоства IsSelected равным true выбирает специальный шаблон HighlightTemplate, а все остальные отображаются при помощи шаблона DefaultTemplate.
В обработчик события SelectedItemChanged (которое возникает при изменении выбранного элемента) дерева TreeView я написал следующий код:
Код:
if (tree.SelectedItem != null)
{
sTask = (Task)tree.SelectedItem;
sTask.IsSelected = true;
}
Надеясь что при изменении свойства конкретного объекта Task из коллекции источника TreeView применит шаблон HighlightTemplate для его отображения, но этого не происходит. Выходит что ItemsColtrol-ы динамически реагируют только на изменение самого объекта привязки и не реагируют на изменение отдельных свойств объекта привязки

В случае если в код добавить
tree.Items.Refresh();
или
переподключить ItemsSource дереву:
tree.ItemsSource = null;
tree.ItemsSource = cTask.Tasks;
то дерево будет перерисовано и шаблон отображения для элемента поменяется, но тогда фокус уйдет с выбранного элемента и все ветки дерева свернуться. Мне естественно нужно оставлять элемент выбранным, т.к. именно для него должен будет отображаться спецовый шаблон.