0

我需要更新TextBox绑定到属性的一个。以我实现它的方式,它工作正常。这是代码

private double foo;

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

但是现在我需要从另一个属性更新这个属性的值,并且TextBox绑定到 Foo 没有更新。这是代码

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的值时,如何更新TextBox绑定到Foo属性的那个?

4

1 回答 1

1

我会说你应该更新Foo你的Foo1setter 中的公共成员。这将导致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并更改FoowhenFoo1 更改的值(不一定每次调用 setter 时),只需添加一个检查以查看值是否已更改。这将解决您的递归问题。

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