私はC#でWindows8ストアアプリのカスタムコントローラーに取り組んでいます。いくつかのDependencyPropertiesを追加しました。いくつかの単純なもの(Radius
以下のような)と、さまざまな形状を構築および描画するために使用されるカスタムアイテムのコレクション(NinjaSource
)。
<StackPanel>
<cc:NinjaControl Margin="120,0,0,0" NinjaSource="{Binding NinjaCollection}" Radius="45"/>
</StackPanel>
コレクションはこんな感じ
public ObservableCollection<Ninja> NinjaCollection{ get; set; }
そして忍者クラスは基本的にいくつかのプロパティと実装を持っています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));
助けていただければ幸いです。