Повторные дети в WPF TreeView - PullRequest
       10

Повторные дети в WPF TreeView

2 голосов
/ 02 сентября 2011

Решил сам.Это был способ, которым я инициализировал коллекцию настроек.Указание значения по умолчанию при регистрации его в качестве DependencyProperty приводит к тому, что все параметры настройки ссылаются на один и тот же объект коллекции.Добавление конструктора в Category и явная инициализация настроек решают проблему.


Класс Class задает имя и коллекцию объектов настроек.

using System.Collections.ObjectModel;
using System.Windows;

namespace CasEdit
{
  public class Categories : ObservableCollection<Category> { }

  public class Category : DependencyObject
  {
    public string Caption
    {
      get { return (string)GetValue(CategoryProperty); }
      set { SetValue(CategoryProperty, value); }
    }
    public static readonly DependencyProperty CategoryProperty =
        DependencyProperty.Register("Caption", typeof(string), typeof(Category), 
        new UIPropertyMetadata("Category name not set"));
    public Settings Settings
    {
      get { return (Settings)GetValue(SettingsProperty); }
    }
    public static readonly DependencyProperty SettingsProperty =
        DependencyProperty.Register("Settings", typeof(Settings), typeof(Category), 
        new UIPropertyMetadata(new Settings()));
  }
}

В следующем XAML определяются шаблоны,Пользовательский интерфейс и некоторые тестовые данные.

<Window x:Class="CasEdit.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:CasEdit="clr-namespace:CasEdit"
        Title="MainWindow" Height="350" Width="525" >
  <Window.Resources>
    <HierarchicalDataTemplate DataType="{x:Type CasEdit:Category}" ItemsSource="{Binding Settings}">
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Caption}" />
        <Button Content="Gratuitous button" Margin="3" Click="Button_Click"/>
      </StackPanel>
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type CasEdit:Setting}" >
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Caption}" Margin="3" />
        <TextBlock Text="{Binding Template}" Margin="3" />
        <TextBox Text="{Binding Editor}" Margin="3" />
        <TextBlock Text="{Binding CasDevice}" Margin="3" />
      </StackPanel>
    </DataTemplate>
    <CasEdit:Categories x:Key="cats">
      <CasEdit:Category Caption="1st category">
        <CasEdit:Category.Settings>
          <CasEdit:Setting Caption="Setting 1-1" />
          <CasEdit:Setting Caption="Setting 1-2" />
        </CasEdit:Category.Settings>
      </CasEdit:Category>
      <CasEdit:Category Caption="2nd category" >
        <CasEdit:Category.Settings>
          <CasEdit:Setting Caption="Setting 2-1" />
        </CasEdit:Category.Settings>        
      </CasEdit:Category>
      <CasEdit:Category Caption="3rd category" >
        <CasEdit:Category.Settings>
          <CasEdit:Setting Caption="Setting 3-1" />
        </CasEdit:Category.Settings>        
      </CasEdit:Category>
    </CasEdit:Categories>
  </Window.Resources>
  <Grid>
    <TreeView x:Name="tree" ItemsSource="{Binding Source={StaticResource cats}}" />
  </Grid>
</Window>

Можно ожидать, что такое дерево будет

  • 1-я категория
    • Настройка 1-1
    • Настройка1-2
  • 2-я категория
    • Настройка 2-1
  • 3-я категория
    • Настройка 3-1

но я получаю вот это

Screen snap

, что очень сбивает с толку.Куда я сбился с пути, чтобы в каждой категории отображались все настройки?

1 Ответ

1 голос
/ 02 сентября 2011

Последний параметр здесь говорит о том, что каждый экземпляр Category имеет свое свойство Settings, инициализированное для указания на один и тот же объект:

public static readonly DependencyProperty SettingsProperty =   
        DependencyProperty.Register("Settings", typeof(Settings), typeof(Category),    
        new UIPropertyMetadata(new Settings()));   

Вместо этого сделайте следующее:

    public static readonly DependencyProperty SettingsProperty =
        DependencyProperty.Register("Settings", typeof(Settings), typeof(Category),
        new UIPropertyMetadata(null));
    public Category()
    {
        Settings = new Settings();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...