1

私は基本的にこの男と同じ問題を抱えています:エラー: " 'Subjects' property was already registered by 'Period' " フォームに複数のコントロールが配置されると発生します

私たちの主な違いは、xaml がプロパティを変更したときに、ローカル インスタンスにアクセスできるイベントをサブスクライブしたいということです。

だから私は私のUserControlを持っています:

public partial class BoardSquare : UserControl
{
    public BoardSquare()
    {
        InitializeComponent();
        Location = new BoardLocation(Int32.MinValue, Int32.MinValue);

        XPositionProperty =
             DependencyProperty.Register("XPosition", typeof(int),
             typeof(BoardSquare), new PropertyMetadata(
                 new PropertyChangedCallback((value, args) => 
                 { 
                     Location.X = (int)args.NewValue;
                     resetBackgroundColorToPosition();
                 })));
        YPositionProperty=
            DependencyProperty.Register("YPosition", typeof(int),
            typeof(BoardSquare), new PropertyMetadata(
                new PropertyChangedCallback((value, args)=>
                {
                    Location.Y = (int)args.NewValue;
                    resetBackgroundColorToPosition();
                })));
    }

    private void resetBackgroundColorToPosition()
    {
        this.Background = (Brush)(new ColorEnumToBrushesConverter()).Convert(Location.GetSquareColor(), typeof(BlackWhiteColor), null, null);
    }

    public readonly DependencyProperty XPositionProperty;
    public readonly DependencyProperty YPositionProperty;

    public int XPosition
    {
        get
        {
            return (int)GetValue(XPositionProperty);
        }
        set
        {
            SetValue(XPositionProperty, value);
        }
    }

    public int YPosition 
    { 
        get
        {
            return (int)GetValue(YPositionProperty);
        }
        set
        {
            SetValue(YPositionProperty, value);
        }
    }

    public BoardLocation Location { get; set; }
}

ここに私のXAMLがあります:

<local:BoardSquare Grid.Column="3" Grid.Row="0" XPosition="3" YPosition="0"/>
<local:BoardSquare Grid.Column="4" Grid.Row="0" XPosition="4" YPosition="0"/>

私が理解していることから、解決策は XPositionProperty を静的にしてから静的コンストラクターに登録することです。私の問題は、PropertyChangeCallback イベントが発生したときにクラスのローカル インスタンスにアクセスできないことです。

XAML でプロパティを設定し、C# コードで on property changed イベントを取得するにはどうすればよいですか?

依存関係プロパティよりも優れた解決策はありますか?


以下は、回答を実装した後の BoardSquare の作業コードです。

    public partial class BoardSquare : UserControl
{
    static BoardSquare()
    {
        XPositionProperty =
             DependencyProperty.Register("XPosition", typeof(int),
             typeof(BoardSquare), new PropertyMetadata(
                 new PropertyChangedCallback((objectInstance, args) =>
                 {
                     BoardSquare boardSquare = (BoardSquare)objectInstance;
                     boardSquare.Location.X = (int)args.NewValue;
                     boardSquare.resetBackgroundColorToPosition();
                 })));
        YPositionProperty =
            DependencyProperty.Register("YPosition", typeof(int),
            typeof(BoardSquare), new PropertyMetadata(
                new PropertyChangedCallback((objectInstance, args) =>
                {
                    BoardSquare boardSquare = (BoardSquare)objectInstance;
                    boardSquare.Location.Y = (int)args.NewValue;
                    boardSquare.resetBackgroundColorToPosition();
                })));
    }

    public BoardSquare()
    {
        InitializeComponent();
        Location = new BoardLocation(Int32.MinValue, Int32.MinValue);


    }

    private void resetBackgroundColorToPosition()
    {
        this.Background = (Brush)(new ColorEnumToBrushesConverter()).Convert(Location.GetSquareColor(), typeof(BlackWhiteColor), null, null);
    }

    public static readonly DependencyProperty XPositionProperty;
    public static readonly DependencyProperty YPositionProperty;

    public int XPosition
    {
        get
        {
            return (int)GetValue(XPositionProperty);
        }
        set
        {
            SetValue(XPositionProperty, value);
        }
    }

    public int YPosition 
    { 
        get
        {
            return (int)GetValue(YPositionProperty);
        }
        set
        {
            SetValue(YPositionProperty, value);
        }
    }

    public BoardLocation Location { get; set; }
}
4

2 に答える 2

0

あなたの質問を正しく理解できれば、すでに WPF 証明書のプロパティを独自のもので上書きしようとしています。ここでは必要ないと思います。XPosition が既に WPF 証明書プロパティである場合は、INotifypropertychanged を呼び出すセッターで getter/setter を使用してユーザー コントロールにプロパティを作成するだけです。この場合、同じ名前だけが必要で動作が異なる場合を除き、依存関係プロパティは必要ありません。なぜそれが必要なのですか?

于 2013-09-03T22:57:48.457 に答える