0

3 つのプロパティを持つ単純なユーザー コントロールを作成しています。簡単にするために、これらがA、B、およびCであると仮定しましょう。さらに、C = A + Bです。それらすべてをTextBoxに表示したい(A、B - ユーザー編集可能、C - 読み取り専用)。ユーザーが A または B を変更するたびに、C の値を更新する必要があります。

MyControl.xaml.cs ファイルに A と B の依存関係プロパティを既に作成しています。

    public static readonly DependencyProperty AProperty =
            DependencyProperty.Register("A", typeof(double),
            typeof(MyControl), new FrameworkPropertyMetadata(0.0));

    public double A
    {
        get { return (double)GetValue(AProperty); }
        set { SetValue(AProperty, value); }
    }

    public static readonly DependencyProperty BProperty =
            DependencyProperty.Register("B", typeof(double),
            typeof(MyControl), new FrameworkPropertyMetadata(0.0));

    public double B
    {
        get { return (double)GetValue(BProperty); }
        set { SetValue(BProperty, value); }
    }

私の質問は、C で何をすべきか、その定義をどこに保持する必要があるかということです。ロジックをコントロール内にコーディングする必要がありますか、それともプロパティ間の関係を覚えておくのはユーザーの責任ですか?

4

2 に答える 2

2

DependencyPropertyで別のforを宣言Cし、UserControlプロパティ変更ハンドラをAおよびBプロパティに追加して、値が変更されたときに の値を更新する必要がありCます。これは仕事をするはずです:

public static readonly DependencyProperty AProperty =
    DependencyProperty.Register("A", typeof(double),
    typeof(MyControl), new UIPropertyMetadata(0.0, OnAOrBPropertyChanged));

public static readonly DependencyProperty BProperty =
    DependencyProperty.Register("B", typeof(double),
    typeof(MyControl), new UIPropertyMetadata(0.0, OnAOrBPropertyChanged));

public static void OnAOrBPropertyChanged(DependencyObject dependencyObject, 
    DependencyPropertyChangedEventArgs e)
{
    dependencyObject.SetValue(CProperty, (double)dependencyObject.GetValue(AProperty) +
        (double)dependencyObject.GetValue(BProperty));
}

read-only を宣言する方法については、MSDNのRead-Only Dependency PropertiesDependencyPropertyページを参照してください。

于 2013-10-13T22:08:53.733 に答える
1

C用の別の依存関係プロパティも作成する必要があります

これを試すことができます:

public static readonly DependencyProperty AProperty =
            DependencyProperty.Register("A", typeof(double),
            typeof(MyControl), new FrameworkPropertyMetadata(OnAorBChange));

        public double A
        {
            get { return (double)GetValue(AProperty); }
            set { SetValue(AProperty, value); }
        }

        public static readonly DependencyProperty BProperty =
                DependencyProperty.Register("B", typeof(double),
                typeof(MyControl), new FrameworkPropertyMetadata(OnAorBChange));

        public double B
        {
            get { return (double)GetValue(BProperty); }
            set { SetValue(BProperty, value); }
        }

        public static readonly DependencyProperty CProperty =
           DependencyProperty.Register("C", typeof(double),
           typeof(MyControl), new FrameworkPropertyMetadata(null));

        public double C
        {
            get { return (double)GetValue(CProperty); }
            set { SetValue(CProperty, value); }
        }

        private static void OnAorBChange(DependencyObject obj,
           DependencyPropertyChangedEventArgs args)
        {
            var obj1 = obj as MyControl;
            obj1.C = obj1.A + obj1.B;
        }

私はあなたが適切なバインディングをしたと思います:)

于 2013-10-14T07:25:26.397 に答える