使用此模型构建递归WPF TreeView:
public class Category
{
public virtual ICollection<Category> Category1 { get; set; }
public virtual Category Category2 { get; set; }
}
所以(名字很糟)Category1是子类别的集合,Category2是父类别。如果它位于树的顶层,则后者可以为null。
TreeView的呈现方式如下:
<TreeView ItemsSource="{Binding Categories}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Category1}">
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.ViewContentsCommand}"
CommandParameter="{Binding}" Width="100" HorizontalAlignment="Stretch">
<TextBlock FontWeight="Bold" Text="{Binding Name}"></TextBlock>
</Button>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
类别是一个ObservableCollection,因此当用户通过UI添加或删除集合中的项目时,它应该更新。在显示方面,这一切都按预期工作。
我无法弄清楚当用户将一个项目添加到集合时会发生什么。这是代码:
public void AddCategory()
{
Category c = new Category { Description = "New Category", Category2Id = SelectedCategory.CategoryId };
Categories.Add(c);
OnPropertyChanged("Categories"); //to refresh the UI
}
如果你在这里粘贴一个断点并检查Categories集合,它就像预期的那样 - 新项目已插入树所在的位置,在其指定的ParentId下面。在顶层(即Category2Id为null的项目),项目数与之前相同。但是在UI中,这个新项目会被渲染为好像它位于顶层而不是树中的正确位置。
起初,我想知道这是否是直接与ObservableCollection合作的特点,所以我尝试了这个:
public void AddCategory()
{
List<Category> cats = Categories.ToList();
Category c = new Category { Description = "New Category", Category2Id = SelectedCategory.CategoryId };
cats.Add(c);
Categories = cats.ToObservableCollection();
}
我希望它没有效果,但令我惊讶的是,根本没有发生任何事情 - 即新类别根本没有出现在用户界面中。
我做错了什么?
答案 0 :(得分:0)
在集合上调用Add
方法不会警告INotifyPropertyChanged
interface任何更改...只需手动调用(您的接口方法实现)...
NotifyPropertyChanged("Categories");
...在AddCategory
方法的末尾,提醒界面Categories
集合已更改。