question

MaikSmith-8475 avatar image
MaikSmith-8475 asked ·

Die Items-Sammlung muss vor dem Verwenden von ItemsSource leer sein.

Hallo!

Ich möchte ein hierarchical TreeView aus einem hierarischen Datamodel erstellen.

Die ItemsSource des TreeView binde ich an das Datamodel über die DataSource des Treeviews.

 <TreeView ItemsSource="{Binding ListHDItems}"/>

8669-treeview-ohne-datatemplate.jpg

TreeView ohne DataTemplate



Wie erwartet, werden die beiden (im Datamodel definierten) Einträge angezeigt.


Wenn ich jetzt jedoch auch nur ein DataTemplate zur formatierten Anzeige der Einträge einfüge, kommt die Fehlermeldung:

Die Items-Sammlung muss vor dem Verwenden von "ItemsSource" leer sein.
<TreeView ItemsSource="{Binding ListHDItems}">
<HierarchicalDataTemplate DataType="{x:Type local:HD_Item}" >
<TextBlock Text="{Binding Item_Bezeichnung}" />
</HierarchicalDataTemplate>
</TreeView>



8700-fehlermeldung.jpg


Woran kann das denn liegen?


Fred.

======================================

Das Datamodel:
public class HierarchicalData : INotifyPropertyChanged
{
#region PropertyChanged ------------------------
public event PropertyChangedEventHandler PropertyChanged; // Event-Handler für Change-Ereignis definieren
private void Notify(string argument) // PropertyChanged auslösen
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(argument));
}
#endregion

 public HierarchicalData(List<HD_Item> _ListHDItems = null)
 {
     if (_ListHDItems != null) ListHDItems = _ListHDItems;
     else ListHDItems = new List<HD_Item>();
 }

 private List<HD_Item> _ListHDItems;
 public List<HD_Item> ListHDItems
 {
     get { return _ListHDItems; }
     set { _ListHDItems = value; Notify("ListHDItems"); }
 }

}

/// <summary>
/// Eintrag, der in einer hierarischen Auflistung benutzt werden kann.
/// </summary>
public class HD_Item : INotifyPropertyChanged
{
#region PropertyChanged ------------------------
public event PropertyChangedEventHandler PropertyChanged; // Event-Handler für Change-Ereignis definieren
private void Notify(string argument) // PropertyChanged auslösen
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(argument));
}
#endregion

 /// <summary>
 /// Hierarischer Eintrag
 /// </summary>
 /// <param name="_Item_Bezeichnung">Bezeichnung des Eintrages.</param>
 /// <param name="_ListHDItems">Liste der untergeordneten Einträge.</param>
 /// <param name="_Fett">Soll der hierarische Eintrag fett dargestellt werden.</param>
 /// <param name="_IsExpanded">Sollen untergeordnete Einträge angezeigt werden? (aufgeklappt?)</param>
 public HD_Item(string _Item_Bezeichnung, List<HD_Item> _ListHDItems=null, FontWeight? _Fett = null, bool? _IsExpanded = null)
 {
     Item_Bezeichnung = _Item_Bezeichnung; 
     if (_ListHDItems != null) ListHDItems = _ListHDItems;
     else ListHDItems = new List<HD_Item>();
     if (_Fett != null) Fett = (FontWeight)_Fett;
     else Fett = FontWeights.Normal;
     if (_IsExpanded != null) IsExpanded = (bool)_IsExpanded;
     else IsExpanded = false;
 }

 private string _Strg_Item_Bezeichnung = string.Empty;
 public string Item_Bezeichnung 
 { 
     get { return _Strg_Item_Bezeichnung; } 
     set { _Strg_Item_Bezeichnung = value; Notify("Item_Bezeichnung"); } 
 }
        
 private List<HD_Item> _ListHDItems = new List<HD_Item>();
 public List<HD_Item> ListHDItems
 {
     get { return _ListHDItems; }
     set { _ListHDItems = value; Notify("ListHDItems"); }
 }

 private FontWeight _Fett = FontWeights.Normal;
 public FontWeight Fett 
 { 
     get { return _Fett; }
     set { _Fett = value;  Notify("Fett"); }
 }

 private bool _IsExpanded = false;
 public bool IsExpanded
 {
     get { return _IsExpanded; }
     set { _IsExpanded = value; Notify("IsExpanded"); }
 }

}



Die erstellten Daten:
public MainWindow()
{
InitializeComponent();
HierarchicalData dm = new HierarchicalData();
HD_Item Item1_1 = new HD_Item("Kündigungsgründe", new List<HD_Item> {new HD_Item("Standard")}, FontWeights.Bold, true);
HD_Item Item1_2 = new HD_Item("Leerstands-Auswertung", new List<HD_Item> { new HD_Item("Leerstandsliste")}, FontWeights.Bold, true);
HD_Item Item0_2 = new HD_Item("Controlling", new List<HD_Item> { new HD_Item("Gesamtliste")}, FontWeights.Bold, true);
HD_Item Item0_1 = new HD_Item("Allgemein", new List<HD_Item> { Item1_1, Item1_2 });
dm.ListHDItems.Add(Item0_1); dm.ListHDItems.Add(Item0_2);
TV_Reportauswahl.DataContext = dm;
}


windows-wpf
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

1 Answer

PeterFleischer-3316 avatar image
PeterFleischer-3316 answered ·

Hi Fred, Ein DataTemplate hat in einem TreeView nichts zu suchen. Da sollte eine Ressource mit HierarchicalDataTemplate mit Bezug auf den Typ das darzustellenden Datenobjektes genutzt werden. Zeig mal den von dir genutzten XAML des TreeView und der genutzten Ressourcen.

Share
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.