0

TextBoxプロパティにバインドされているを更新する必要があります。私がそれを実装した方法では、それはうまく機能しています。これがコードです

private double foo;

public double Foo
{
  get { return foo; }
  set
  {
    foo = value;
    RaisePropertyChanged(() => Foo);
  }
}

しかし、今度はこのプロパティの値を別のプロパティから更新する必要があり、TextBoxFooへのバインドは更新されません。これがコードです

private string foo1

public string Foo1
{
  get { return foo1; }
  set
  {
    foo1 = value;
    foo = 4; // Updating the Foo property indirectly
    RaisePropertyChanged(() => Foo);
    RaisePropertyChanged(() => Foo1);
  }
}

Fooと別のプロパティが相互に更新されるため、プロパティFooの値をそのように更新する必要があります。そのため、無限再帰に陥るため、プロパティを直接更新することはできません。

問題は、属性fooの値を変更したときに、 FooTextBoxプロパティにバインドされているを更新するにはどうすればよいですか?

4

1 に答える 1

1

セッターのパブリックメンバーFooを更新する必要があると思います。Foo1これにより、RaisePropertyChangedイベントが発生しFooます。

private string foo1

public string Foo1
{
  get { return foo1; }
  set
  {
    foo1 = value;
    Foo = 4;
    RaisePropertyChanged(() => Foo1);
  }
}

RaisePropertyChanged(() => Foo);プライベートフィールドを更新するときはいつでも呼び出すことができますfooが、プロパティを使用しない正当な理由がない限りFoo、私は常にそれを使用しfooます。setプロパティの値が変更されるたびにそのコードを実行することを目的としています。私の意見では、プライベートフィールドを設定すると、setこの意図に違反するコードがバイパスされます。

編集

別の注意点として、変更RaisePropertyChangedの値のみを呼び出して変更したい場合(必ずしもセッターが呼び出されるたびにではない)、値が変更されたかどうかを確認するためのチェックを追加するだけです。これにより、再帰の問題が解決されます。FooFoo1

set
{
    if(foo1 != value)
    {
       foo1 = value;
       Foo = 4;
       RaisePropertyChanged(() => Foo1);
    }
}
于 2012-07-11T12:39:35.993 に答える