WPF Treeview - привязка к коллекции с разной глубиной и стилизация по-разному - PullRequest
2 голосов
/ 19 октября 2010

Извиняюсь за длинный пост - Прочтите об этом несколько тем, но все еще не можете его реализовать.По сути, у меня есть коллекция объектов, определенных как:

public class LibData
{
    public string Name { get; set; }
    ObservableCollection<LibObject> _list;
    public ObservableCollection<LibObject> List { get { return _list; } }

    public LibData(string name, LibDataType type)
    {
        this.Name = name;
        _list = new ObservableCollection<LibObject>();
    }
}

и объекта:

public class LibObject
{
    public string Name { get; set; }

    public LibObject(string name)
    {
        this.Name = name;
    }
}

Моя главная проблема в XAML и стилизации этого TreeView.Мне нужно иметь особый стиль для «корневого» элемента и особый стиль для «листа».Дело в том, что один элемент в связанном списке - «Root-> Leaf», а другой - «Root-> Child-> Leaf».Я попробовал это:

<TreeView x:Name="myTree" ItemsSource="{x:Static local:myDataList}">
     <TreeView.ItemTemplate>
         <HierarchicalDataTemplate ItemsSource="{Binding Path=List}" >
             <Grid>
                 <StackPanel Orientation="Horizontal">
                      <TextBlock Text="{Binding Path=Name}" />
                      <CheckBox IsChecked="True" Content="HeaderCheckbox"/>
                 </StackPanel>
             </Grid>
         <HierarchicalDataTemplate.ItemTemplate >
              <DataTemplate>
                  <Grid>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="True" Content="LeafCheckbox" />
                <TextBlock Text="{Binding Path=Name}"/>
            </StackPanel>
                  </Grid>
              </DataTemplate>
          </HierarchicalDataTemplate.ItemTemplate>
      </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>

Это, очевидно, прекрасно работает для элемента "Корень-> Лист", но не для элемента "Корень-ребенок-лист".Реализация XAML кажется более «жестко закодированным» решением, где я знаю, что макет элемента всегда «Root-> Leaf» - как мне сделать это динамичным?Опять же, я видел решения для разных уровней (включая использование конвертеров), но проблема, с которой я столкнулся, заключается в том, что мне нужны особые стили для корня и листа и ничего для промежуточных уровней.Мне интересно, смотрю ли я на это совершенно неправильно ...

1 Ответ

6 голосов
/ 20 октября 2010

Простой способ сделать это.Извлеките DataTemplates из TreeView и поместите их в раздел ресурсов.Укажите свойство DataType для каждого DataTemplate, но не включайте ключ.ItemTemplateSelector (свойство типа DataTemplateSelector) в TreeView будет магически использовать тот тип данных, который подходит для правильного типа элемента.

Создать HierarchicalDataTemplate для типов Root и Child и DataTemplate для типа Leaf.

Примерно так:

<Window.Resources>
    <ResourceDictionary>

        <DataTemplate DataType="{x:Type local:Leaf}">
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="True" Content="LeafCheckbox" />
                    <TextBlock Text="{Binding Path=SomeValue}"/>
                </StackPanel>
            </Grid>
        </DataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:Child}"
                                  ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Child " />
                <TextBlock Text="{Binding Path=SomeValue}" />
            </StackPanel>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:Root}"
                                  ItemsSource="{Binding Children}">
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Root " />
                    <TextBlock Text="{Binding Path=SomeValue}" />
                </StackPanel>
            </Grid>
        </HierarchicalDataTemplate>

    </ResourceDictionary>
</Window.Resources>

<Grid>
    <TreeView x:Name="myTree" ItemsSource="{Binding}" />
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...