2013-12-03 4 views
2

Как изменить мой текущий TreeView для поддержки родительского узла «Critical, Alert», а потом дочерние узлы будут сообщениями этого типа серьезности. Я использую ObservableCollection, привязанный к TreeView. В каждом типе сообщений больше данных, но я хочу, чтобы некоторые из них были видимыми для пользователя. Затем, когда пользователь нажимает на один из дочерних узлов, вытащите другие данные из этого элемента в коллекции и отобразите его там, где это необходимо. Я добавил идентификатор как скрытый, потому что я не уверен, что мне нужно что-то для ссылки, которое уникально для ссылки на этот элемент в коллекции. Я также хочу по умолчанию различать значок для каждого родительского узла, у дочерних узлов не будет значка.WPF TreeView Узлы и вспомогательные узлы

Надеюсь, я опишу это, так что это понятно.

XMAL

<TreeView x:Name="tvMessages" HorizontalAlignment="Left" Height="262" Margin="10,37,0,0" VerticalAlignment="Top" Width="248"> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Image Source="{Binding Icon}" /> 
          <TextBlock Text="{Binding Description}" /> 
          <TextBlock Text="{Binding ID}" Visibility="Hidden" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate> 
      </TreeView> 

MessageData

public class MessageData 
{ 
    public Guid ID { get; set; } 
    public string Severity { get; set; } 
    public string Description { get; set; } 
    public string ClientID { get; set; } 
    public string Specialty { get; set; } 
    public DateTime IssuedDate { get; set; } 
} 

ответ

1

Для отображения иерархических данных ... Вам нужно иметь иерархические данные. Самый простой способ сделать это, чтобы добавить коллекцию (для дочерних узлов) типа MessageData в свой MessageData класс:

public class MessageData 
{ 
    public Guid ID { get; set; } 
    public string Severity { get; set; } 
    public string Description { get; set; } 
    public string ClientID { get; set; } 
    public string Specialty { get; set; } 
    public DateTime IssuedDate { get; set; } 
    public ObservableCollection<MessageData> Messages { get; set; } 
} 

изменения, необходимые для XAML также мала:

<TreeView x:Name="tvMessages" ItemsSource="{Binding YourMessageDataObservableCollection}" HorizontalAlignment="Left" Height="262" Margin="10,37,0,0" VerticalAlignment="Top" Width="248"> 
    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type YourxmlNamespacePrefix:MessageData}"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Icon}" /> 
       <TextBlock Text="{Binding Description}" /> 
       <TextBlock Text="{Binding ID}" Visibility="Hidden" /> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Messages}" /> 
    </TreeView.ItemTemplate> 
</TreeView> 

Очки отметить:

  • Вы должны быть Binding ваш ObservableCollection к TreeView.ItemsSource собственности.
  • Вы должны реализовать интерфейс INotifyPropertyChange в своем классе MessageData, если вы хотите, чтобы ваш пользовательский интерфейс обновлялся при изменении данных.
  • Добавляя DataTemplate в раздел TreeView.Resources без установки x:Key свойства, он явно будет установлен на всех MessageData экземпляров в TreeView.
Смежные вопросы