Как создать HierarchicalDataTemplate в коде позади? - PullRequest
0 голосов
/ 20 октября 2011

Мне нужно создать HierarchicalDataTemplate для TreeView в коде позади.

Вот как выглядит мой XAML:

<DataTemplate x:Key="DetailTemplate">
        <StackPanel Orientation="Horizontal">
            <Image Height="15" Width="15" Source="{Binding Image}" Margin="0,0,5,0"/>
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </DataTemplate>

    <HierarchicalDataTemplate x:Key="MasterDetailTemplate" 
                              ItemsSource="{Binding SomeSource}" 
                              ItemTemplate="{StaticResource DetailTemplate}">
        <StackPanel Orientation="Horizontal">
            <Image Height="15" Width="15" Source="{Binding Image}" Margin="0,0,5,0"/>
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </HierarchicalDataTemplate>

Эточто я получил в c #:

        Image image = new Image();
        image.Name = "image";
        image.Height = 15;
        image.Width = 15;

        Binding imageBinding = new Binding("Image");
        BindingOperations.SetBinding(image, Image.SourceProperty, imageBinding);

        TextBlock textBlock = new TextBlock();
        textBlock.Name = "textBlock";

        Binding textBinding = new Binding("Text");
        BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, textBinding);

        StackPanel stackPanel = new StackPanel();
        stackPanel.Orientation = Orientation.Horizontal;

        stackPanel.Children.Add(image);
        stackPanel.Children.Add(textBlock);

        DataTemplate dataTemplate = new DataTemplate();
        dataTemplate.DataTemplateKey

Я застрял на DataTemplateKey.

  • Возможно ли это сделать в коде позади?
  • Куда мне пойти отсюда, чтобы установить значение x:Key?

1 Ответ

4 голосов
/ 20 октября 2011

ОК. В своем комментарии к вашему вопросу я указал код для определения шаблонов.Теперь, чтобы использовать / ссылаться на них с помощью ключа, когда мы добавляем их в ResourceDictionaties, мы должны добавить их с помощью ключа.

   myWindow.Resources.Add("MasterDetailTemplate", dataTemplate);

Вместо myWindow это может быть myParentPanel, то есть любой предок вашего дереваПосмотреть.

Но есть одна проблема ..

Ключ (т. Е. DataTemplate) не существует во время разработки.Вы создаете и добавляете его во время выполнения.

Таким образом, если вы ссылаетесь на этот шаблон данных, тогда

  1. Либо обратитесь к ресурсу после его добавления в словарь ресурсов.

    например,

    myWindow.Resources.Add(
         "MasterDetailTemplate",
         dataTemplate);
    
     myTreeView.ItemTemplate
       = myWindow.Resources["MasterDetailTemplate"] as HierarchicalDataTemplate;
    
  2. См. Динамически созданный шаблон данных как DynamicResource в XAML.DynamicResource устраняет необходимость предварительного существования MasterDetailTemplate в любом словаре ресурсов.

    <TreeView ItemTemplate="{DynamicResource MasterDetailTemplate}" ... >
      ....
    </TreeView>
    

Надеюсь, это поможет.

...