假设我有一个名为Greeting
的属性,它主要由两个绑定属性组成:LastName
和FirstName
。我可以订阅名字和姓氏的更新,因此我可以强制使用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")
放入FirstName
和LastName
的设置器中,但这感觉不对。在一个更复杂的例子中,我宁愿每个对象只在事情发生变化时自己刷新。
问:) 当其中一个属性更改时,我可以强制更新ReadOnly
属性吗?
答案 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
您可以自己订阅ViewModel的PropertyChanged
AddHandler this.PropertyChanged, AddressOf PropertyChanged
并在PropertyChanged
中,您可以检查哪些属性已更改,具体取决于您可以使用RaisePropertyChanged for Greeting
答案 1 :(得分:1)
借用nit's answer来解决这个问题。以下是我在Greeting
或FirstName
更改时对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
PropertyChanged
接口的一部分实现的INotifyPropertyChanged
事件。PropertyName
值是否等于“FirstName”或“LastName”。 OnPropertyChanged()
属性引发Greeting
方法。