当子属性更改时更新复合属性上的绑定

时间:2013-10-23 17:23:14

标签: wpf vb.net mvvm binding inotifypropertychanged

假设我有一个名为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绑定。我可以将OnPropertyChanged("Greeting")放入FirstNameLastName的设置器中,但这感觉不对。在一个更复杂的例子中,我宁愿每个对象只在事情发生变化时自己刷新。

问:) 当其中一个属性更改时,我可以强制更新ReadOnly属性吗?

2 个答案:

答案 0 :(得分:1)

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

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

OR

您可以自己订阅ViewModel的PropertyChanged

AddHandler this.PropertyChanged, AddressOf PropertyChanged

并在PropertyChanged中,您可以检查哪些属性已更改,具体取决于您可以使用RaisePropertyChanged for Greeting

答案 1 :(得分:1)

借用nit's answer来解决这个问题。以下是我在GreetingFirstName更改时对LastName媒体资源进行更新时所做的操作:

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
  • 它处理已作为ViewModel上PropertyChanged接口的一部分实现的INotifyPropertyChanged事件。
  • 然后检查事件参数的PropertyName值是否等于“FirstName”或“LastName”。
  • 如果是,则会手动为OnPropertyChanged()属性引发Greeting方法。