【问题标题】:Update Binding on Composite Property when Child Property Changes子属性更改时更新复合属性上的绑定
【发布时间】:2013-11-02 02:54:30
【问题描述】:

假设我有一个名为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 属性组成的属性之一发生更改时,我可以强制更新它吗?

【问题讨论】:

  • 您想要完全按照您所说的“感觉不对”。这是正确的/最好的/首选的/正常的方式来解决这个问题。根据您的“Q:)”,这确实是唯一的方法。

标签: wpf vb.net mvvm binding inotifypropertychanged


【解决方案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

您可以订阅自己的 ViewModel 的 PropertyChanged

AddHandler this.PropertyChanged, AddressOf PropertyChanged

PropertyChanged 中,您可以检查哪个属性已更改,具体取决于您可以 RaisePropertyChanged 进行问候

【讨论】:

  • 我已经在我的原始问题 (I could put OnPropertyChanged("Greeting") in the setter for FirstName and LastName) 中承认了这种确切的方法。我一直在寻找一些不那么紧密耦合的东西。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2019-03-24
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多