将ItemsSource绑定到包装类中的ObservableCollection

时间:2015-06-03 08:22:32

标签: c# wpf xaml mvvm

我有一个viewmodel的视图,因为它是DataContext。在viewmodel中我有一个ObservableCollection对象:

AvailableCategories = new ObservableCollection<Category>();

我可以将ListView绑定到此ObservableCollection而不会出现这样的问题:

ItemsSource="{Binding Path=AvailableCategories}"

我现在要求将ObservableCollection包装在一个类中(以帮助xml序列化,如下所示:How to rename XML attribute that generated after serializing List of objects

包装类看起来像这样:

    public class CategoryList : ObservableObject
    {
    private ObservableCollection<Category> _categories;
    public ObservableCollection<Category> Categories
    {
            get
            {
                return _categories;
            }
            set
            {
                if (_categories == value)
                {
                    return;
                }
                _categories = value;
                RaisePropertyChanged(()=>Categories);

            }
        }
    }

它会在VM中创建,如下所示:

        CategoryList cl = new CategoryList();
        cl.Categories = new ObservableCollection<Category>();

我现在如何绑定到VM中包装类中的Collection?这似乎不起作用:

ItemsSource="{Binding cl.Categories}" 

编辑:我的虚拟机现在公开了类别列表,如下所示:

    private CategoryList _cl;
    public CategoryList cl 
    {
        get
        {
            return _cl;
        }
        set
        {
            if (value==_cl)
            {
                return;
            }
            _cl = value;
            RaisePropertyChanged(()=>cl);
        }
    }

但仍然没有快乐。

1 个答案:

答案 0 :(得分:-1)

尝试订阅VM中的cl.PropertyChanged事件,并再次在处理程序中调用RaisePropertyChanged(()=>cl)(如果需要,可以先检查e.PropertyName,以避免过多调用)。如果这样做,则意味着当集合属性发生更改时,您的视图不会被通知,因为您绑定到子属性。

如果这也不起作用,您可能必须订阅Categories.CollectionChanged,并从该处理程序中提升cl属性更改...如果可行,则表示它是收集项目更改(添加或删除)未通知视图的内容。

但如果你想确保每次设置属性时都正确添加和删除所有这些处理程序,那么所有这些都会导致代码过于复杂......

通常,建议将子绑定创建到子属性是不明智的,因为它往往会导致这些通知问题。