1

TextBox値の1つが変更された場合、数値を保持する複数のWPF TextBoxをバインドして同じ絶対量を変更する方法は?

複数のテキストボックス

上記のUIがあるとしましょう。CheckBox がチェックされていない場合は、ViewModel プロパティへの通常のバインドが必要です (これが現在のものです)。

<TextBox Text="{Binding Value1}" />
<TextBox Text="{Binding Value2}" />
<TextBox Text="{Binding Value3}" />
<TextBox Text="{Binding Value4}" />
<TextBox Text="{Binding Value5}" />
<CheckBox Content="Relative Changes Constant" IsChecked="{Binding UseRelative}" />

ただし、CheckBox がチェックされ、TextBox の値が変更された場合は、他のすべての TextBox 値を同じ相対的な量だけ上下に更新する必要があります。たとえば、2 番目の TextBox 値が 25 から 30 に更新された場合、他の 4 つの TextBox 値は 39、26、30、32 (5 ずつ増加) になります。

4

1 に答える 1

0

これは、2 つのプロパティのみを使用するソリューションです...

  private int _value1;
    public int Value1
    {
        [DebuggerStepThrough]
        get { return _value1; }
        [DebuggerStepThrough]
        set
        {
            if (value != _value1)
            {
                if (UseRelative)
                {
                    UpdateRelative(value - _value1);
                }
                else
                {
                    _value1 = value;
                    OnPropertyChanged("Value1");
                }
            }
        }
    }
    private int _value2;
    public int Value2
    {
        [DebuggerStepThrough]
        get { return _value2; }
        [DebuggerStepThrough]
        set
        {
            if (value != _value2)
            {
                if (UseRelative)
                {
                    UpdateRelative(value - _value2)
                }
                else
                {
                    _value2 = value;
                    OnPropertyChanged("Value2");
                }
            }
        }
    }
    private void UpdateRelative(int increment)
    {
        _value1 += increment;
        _value2 += increment;
        // update the view
        OnPropertyChanged("Value1");
        OnPropertyChanged("Value2");
    }

この例では、バッキング フィールドが設定される直前にセッターに介入があり、UseRelative 値が true であるかどうかを照会します。そうである場合、セッターは UpdateRelative メソッドを呼び出して戻ります。

UpdateRelative メソッドはバッキング フィールドで動作し、計算が実行されると、パブリックフィールドで OnPropertyChanged を呼び出します。次に、WPF バインディング エンジンはゲッターにクエリを実行し、ビューを更新します (ゲッターはバッキング フィールドを使用するため)。

UseRelative が false の場合は、通常どおりのビジネスです。つまり、標準の WPF プロパティ モデルです。このサンプルの 2 つのプロパティを拡張して、同じ手法を使用して質問に 5 を含めることができます。

于 2013-08-12T21:51:38.930 に答える