1

私は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));

助けていただければ幸いです。

4

1 に答える 1

0

あなたがしたいのは、ObservableCollectionをNinjaSourceとして公開する代わりです。監視可能なコレクションを含むカスタムオブジェクトを作成します。イベントを発生させることができる特定のAddRemoveメソッドを公開します。

于 2013-02-20T16:43:29.247 に答える