集合中的值更改时的通知

时间:2013-02-20 13:13:24

标签: c# xaml windows-8 observablecollection inotifypropertychanged

我正在使用C#中的Windows 8商店应用程序的自定义控制器。 我添加了一些DependencyProperties;一些简单的(如下面的Radius)和一组用于构造和绘制各种形状的自定义项(NinjaSource)。

<StackPanel>
    <cc:NinjaControl Margin="120,0,0,0" NinjaSource="{Binding NinjaCollection}" Radius="45"/>
</StackPanel>

该集合看起来像这样

public ObservableCollection<Ninja> NinjaCollection{ get; set; }

Ninja类基本上有一些属性并实现了INotifyPropertyChanged

public class Ninja : INotifyPropertyChanged
    {
        private string _name;
        private double _value;
        private Path _path;
        private bool _showName;

        public string Name
        {
            get { return _name; }
            set
            {
                if (value == _name) return;
                _name = value;
                OnPropertyChanged();
            }
        }

        ...

每当更改一个简单的属性(如Radius)时,我的自定义控件会将其选中并重绘为:

public sealed partial class NinjaControl: UserControl
{
        public static readonly DependencyProperty RadiusProperty =
            DependencyProperty.Register("Radius", typeof (double), typeof (NinjaControl),
                                        new PropertyMetadata(default(double), PropertyChangedCallback));

        ...

        private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            var instance = o as NinjaControl;

            if (instance == null) return;
            instance.RedrawMyControl();
        }

这很好用,我可以将Radius绑定到我想要的任何地方,并且只要它发生变化就会调用PropertyChangedCallback

当NinjaCollection中内部的任何值发生变化时,我希望发生同样的事情。

我有一个为实际集合注册的DependencyProperty,带有一个属性包装器,但我相信它只会查看实际集合的更改而不是其中的值。

    public static readonly DependencyProperty NinjaSourceProperty = 
DependencyProperty.Register("NinjaSource", typeof(ObservableCollection<Ninja>), typeof(NinjaControl), new PropertyMetadata(new ObservableCollection<Ninja>(), PropertyChangedCallback));

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

你想要做的不是将ObservableCollection暴露为NinjaSource。创建包含可观察集合的自定义对象。公开特定的添加删除方法,然后允许您引发事件。