WPF TreeView gebunden ObservableCollection nicht Wurzelknoten zu aktualisieren
-
22-09-2019 - |
Frage
Sorry - meine Frage ist fast identisch mit diesen ein aber da es nicht eine tragfähige Antwort erhalten haben, ich hoffe, dass jemand anderes ein paar frische Ideen hat.
Ich habe einen WPF-TreeView, die zu einer Hierarchie eines einzigen Typs gebunden ist:
public class Entity
{
public string Title { get; set; }
public ObservableCollection<Entity> Children { get; set; }
}
Die Geräte Entity Klasse INotifyPropertyChanged, aber ich habe diesen Code aus Gründen der Übersichtlichkeit weggelassen.
Das TreeView gebunden an eine ObservableCollection
<TreeView ItemsSource="{Binding Path=Entities}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Zunächst als die TreeView bindet erwartet und zeigt richtig eine Multi-Level-Hierarchie. Auch wenn die Mitgliedschaft in einer der Kinder Sammlungen programmatisch geändert, werden die Änderungen korrekt in der TreeView wider.
Allerdings ändert, auf die Mitgliedschaft in der Fußelement Ebene ObservableCollection
würde Irgendwelche Vorschläge geschätzt.
Danke, Tim
Lösung
Meine erste Vermutung ist, dass Sie so etwas wie die folgenden für den Wurzelknoten haben:
public ObservableCollection<Entity> Entities
{
get;
set;
}
Dann anstatt das zu tun, was [gut] wie folgt aus:
Entities.Clear();
foreach (var item in someSetOfItems)
Entities.Add(item);
Sie tun etwas [schlecht] wie folgt aus:
Entities = new ObservableCollection<Entity>(someSetOfItems);
Es soll möglich sein, das Problem auf die Spur durch das dahinter liegende Feld der Entities Eigenschaft readonly
machen:
private readonly ObservableCollection<Entity> _entities
= new ObservableCollection<Entity>();
public ObservableCollection<Entity> Entities
{
get
{
return _entities;
}
}
Andere Tipps
Eine weitere Erklärung, lange Zeit für die Antwort zu kommen, aber ich glaube, dass, wenn Sie tun das in XAML zu binden, und dann in Code Vergeben Sie ein neues Objekt in die Immobilie, die Sie die Bindung brechen, so würde man die Bindung in wiederholen müssen Code für sie zu arbeiten. Daraus ergibt sich die Lösung mit dem Nur-Lese-Trägerfeld. Wenn wie zu tun, dass Sie nicht in der Lage sein wird, eine neue ObservableCollection zuweisen und Sie werden nicht die Bindung brechen, indem ein neues Objekt auf dem Trägerfeld zuweisen.