C# 将ItemsSource绑定到包装类中的ObservableCollection

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

我有一个视图,其中viewmodel是DataContext。在viewmodel中,我有一个可观察的对象集合:

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以获取列表中的普通对象谢谢-我来看看。如果这是不明智的,我宁愿用另一种方式,但仍然需要完成序列化-也许我会将列表复制到另一个对象并序列化它。