【发布时间】:2013-02-20 13:13:24
【问题描述】:
我正在为 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));
任何帮助表示赞赏。
【问题讨论】:
-
请贴出你的控件的xaml(使用NinjaSource时的部分),问题可能出在那儿
-
我的控件没有任何 XAML,除了来自空画布。控件完全由代码构造
标签: c# xaml windows-8 observablecollection inotifypropertychanged