我正在为C#中的Windows8商店应用程序开发一个自定义控制器。我添加了一些DependencyProperty;一些简单的项目(如下面的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));
感谢您的帮助。
您想要做的是不将ObservableCollection公开为NinjaSource。创建一个包含可观察集合的自定义对象。公开特定的Add-Remove方法,这些方法将允许您引发事件。