2014-11-15 3 views
0

В преобразовании моего дерева для использования флажков, как в статье Джоша Смита, я нахожу свой рабочий код xaml для использования нескольких HierarchicalDataTemplates точно такого же формата, но с разными DataTypes.Как назначить разные типы данных статическому иерархическому шаблону в XAML?

Есть ли какой-либо способ определить единый статический HierarchicalDataTemplate в XAML, но назначить разные типы данных, где xaml создает объекты?

Ниже представлены два рабочих иерархических шаблона. Единственная разница заключается в DataType:

XAML 
<HierarchicalDataTemplate 
       DataType="{x:Type r:ReportViewModel}" 
       ItemsSource="{Binding Children}" 
       > 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox 
           Focusable="False" 
           IsChecked="{Binding IsChecked}" 
           VerticalAlignment="Center" 
         /> 
         <ContentPresenter 
          Content="{Binding Name, Mode=OneTime}" 
          Margin="2,0" 
         /> 
        </StackPanel> 
       </HierarchicalDataTemplate> 

       <HierarchicalDataTemplate 
       DataType="{x:Type r:NetworkViewModel}" 
       ItemsSource="{Binding Children}" 
       > 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox 
     Focusable="False" 
     IsChecked="{Binding IsChecked}" 
     VerticalAlignment="Center" 
     /> 
         <ContentPresenter 
     Content="{Binding Name, Mode=OneTime}" 
     Margin="2,0" 
     /> 
        </StackPanel> 

       </HierarchicalDataTemplate> 

Спасибо за любую помощь.

Добавление: Я нашел частичный ответ на How do I reuse a HierarchicalDataTemplate?

Если кто-то имеет лучшее решение?

ответ

1

Другой вариант - реализовать базовый класс, который обладает свойствами, связанными с TreeView.

например.

public class ReportViewModel : NamedViewModel 
{ 
    .... 
} 

public class NetworkViewModel : NamedViewModel 
{ 
    .... 
} 

public class NamedViewModel : INotifyPropertyChanged 
{ 

    public string Name {get;set;} 
    public bool IsChecked{get;set;} 
    public ObservableCollection<NamedViewModel> Children {get; private set;} 

    ...etc.... 
} 

NB: не показывает полную INotifyPropertyChanged реализации.

Привязать любые объекты производного класса к TreeView.ItemsSource как коллекцию типа базового класса, который должен означать, что ваш HierarchicalDataTemplate для базового класса будет подхвачен системой ввода типа WPF.

например.

<HierarchicalDataTemplate 
      DataType="{x:Type base:NamedViewModel}" 
      ItemsSource="{Binding Children}" 
      > 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox 
          Focusable="False" 
          IsChecked="{Binding IsChecked}" 
          VerticalAlignment="Center" 
        /> 
        <ContentPresenter 
         Content="{Binding Name, Mode=OneTime}" 
         Margin="2,0" 
        /> 
       </StackPanel> 
      </HierarchicalDataTemplate>