0

假设我有一个名为的属性Greeting,它主要由两个绑定属性组成:LastNameFirstName. 我可以订阅名字和姓氏的更新,以便我可以强制刷新OnPropertyChanged()我的 Greeting 属性。这是一个简单的例子:

看法

<TextBox Text="{Binding FirstName}" />
<TextBox Text="{Binding LastName}" />
<TextBlock Text="{Binding Greeting}" />

视图模型

Public Property FirstName() As String
    Get
        Return _firstName
    End Get
    Set(ByVal value As String)
        _firstName = value
        OnPropertyChanged("FirstName")
    End Set
End Property

'... Omitting LastName for brevity ...

Public ReadOnly Property Greeting() As String
    Get
        Return String.Format("Hello {0} {1}", Firstname, LastName)
    End Get
End Property

目前的设置方式,不会更新 Greeting 绑定。我可以为and放入OnPropertyChanged("Greeting")二传手,但这感觉不对。在一个更复杂的例子中,我宁愿每个对象都在发生变化时自行刷新。 FirstNameLastName

问:) 当它所组成的属性之一发生更改时,我可以强制更新属性吗?ReadOnly

4

2 回答 2

1

您可以从 FirstName 和 LastName 的 setter 调用 PropertyChange of Greetings

Public Property FirstName() As String
    Get
        Return _firstName
    End Get
    Set(ByVal value As String)
        _firstName = value
        OnPropertyChanged("FirstName")
        OnPropertyChanged("Greeting")
    End Set
End Property

或者

您可以订阅PropertyChanged您的 ViewModel 本身

AddHandler this.PropertyChanged, AddressOf PropertyChanged

并且PropertyChanged您可以检查哪个属性已更改,具体取决于您可以 RaisePropertyChanged for Greeting

于 2013-10-23T17:51:44.390 回答
1

借用nit的答案,只是为了稍微完善一下。以下是我在更改或更改Greeting时触发属性更新的操作:FirstNameLastName

Private Sub UpdateGreeting(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) _
    Handles Me.PropertyChanged
    If e.PropertyName = "FirstName" OrElse e.PropertyName="LastName" Then
        OnPropertyChanged("Greeting")
    End If
End Sub
  • 它处理PropertyChanged已作为INotifyPropertyChangedViewModel 接口的一部分实现的事件。
  • 然后它检查PropertyName事件参数的值是否等于“FirstName”或“LastName”。
  • 如果是这样,它会手动引发该属性的OnPropertyChanged()方法。Greeting
于 2013-10-23T19:44:01.050 回答