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}"/>
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>
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;
}