C# 将ItemsSource绑定到包装类中的ObservableCollection
我有一个视图,其中viewmodel是DataContext。在viewmodel中,我有一个可观察的对象集合:C# 将ItemsSource绑定到包装类中的ObservableCollection,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个视图,其中viewmodel是DataContext。在viewmodel中,我有一个可观察的对象集合: AvailableCategories = new ObservableCollection<Category>(); 现在,我需要将ObservableCollection封装在一个类中(以帮助进行xml序列化,如下所示:) 包装器类如下所示: ItemsSource="{Binding Path=AvailableCategories}" public c
AvailableCategories = new ObservableCollection<Category>();
现在,我需要将ObservableCollection封装在一个类中(以帮助进行xml序列化,如下所示:)
包装器类如下所示:
ItemsSource="{Binding Path=AvailableCategories}"
public class CategoryList : ObservableObject
{
private ObservableCollection<Category> _categories;
public ObservableCollection<Category> Categories
{
get
{
return _categories;
}
set
{
if (_categories == value)
{
return;
}
_categories = value;
RaisePropertyChanged(()=>Categories);
}
}
}
CategoryList cl = new CategoryList();
cl.Categories = new ObservableCollection<Category>();
private CategoryList _cl;
public CategoryList cl
{
get
{
return _cl;
}
set
{
if (value==_cl)
{
return;
}
_cl = value;
RaisePropertyChanged(()=>cl);
}
}
);
编辑:我的虚拟机现在公开的类别列表如下:
ItemsSource="{Binding Path=AvailableCategories}"
public class CategoryList : ObservableObject
{
private ObservableCollection<Category> _categories;
public ObservableCollection<Category> Categories
{
get
{
return _categories;
}
set
{
if (_categories == value)
{
return;
}
_categories = value;
RaisePropertyChanged(()=>Categories);
}
}
}
CategoryList cl = new CategoryList();
cl.Categories = new ObservableCollection<Category>();
private CategoryList _cl;
public CategoryList cl
{
get
{
return _cl;
}
set
{
if (value==_cl)
{
return;
}
_cl = value;
RaisePropertyChanged(()=>cl);
}
}
但是仍然没有乐趣。尝试在VM中订阅
cl.PropertyChanged
事件,并再次在处理程序调用RaisePropertyChanged(()=>cl)
中订阅(如果需要,可以先检查e.PropertyName,以避免调用过多)。如果这样做有效,则意味着在集合属性更改时不会通知您的视图,因为您正在绑定到子属性
如果这也不起作用,您可能必须订阅Categories.CollectionChanged
,并从该处理程序中引发cl
属性更改。。。如果这样做有效,则表示集合项正在更改(添加或删除)未通知视图的内容
但是,如果您想确保在每次设置属性时正确添加和删除所有这些处理程序,所有这些都可能导致代码过于复杂
一般来说,创建到子属性的绑定是不明智的,因为它往往会导致这些通知问题。视图模型应该公开CategoryList类型的属性,例如
public CategoryList CategoryList{get;}
。然后您将绑定到CategoryList.Categories
。查看输出窗口以获取线索。看起来数据上下文可能没有设置,或者不正确。如果我不包装该类并直接使用集合,它就可以正常工作-因此我认为这可能与XAML语法有关。输出窗口没有抛出任何可疑内容。不确定我是否正确理解了它,但您的问题与序列化有关。是,任何包含事件的内容都无法序列化。您可以像链接“”中提到的那样覆盖ObservaleCollection,然后在其中添加方法getdata以获取列表中的普通对象谢谢-我来看看。如果这是不明智的,我宁愿用另一种方式,但仍然需要完成序列化-也许我会将列表复制到另一个对象并序列化它。