2013-10-23 247 views
0

比方說,我有一個名爲Greeting的屬性,主要由兩個綁定屬性LastNameFirstName組成。我可以訂閱名字和姓氏的更新,因此我可以用我的Greeting屬性強制更新OnPropertyChanged()。這裏有一個簡單的例子:更新孩子屬性更改時複合屬性的綁定

查看

<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 

這是目前設置方式,任何事都不能更新的問候裝訂。我可以把OnPropertyChanged("Greeting")放在設置器FirstNameLastName,但這種感覺不對。在一個更復雜的例子中,我寧願每個對象都會在某些事情發生變化時照顧自己。

問::)我可以強制ReadOnly屬性的更新,當它由其中一個屬性組成的變化?

+0

你想要做的就是你說的「感覺不對」。這是正確的/最好的/最好的/正常的方式。根據你的「Q :)」,這是真正做到這一點的唯一方法。 – Steve

回答

1

您可以從名字的setter和姓氏致電問候的PropertyChange

​​

OR

您可以訂閱您的視圖模型的PropertyChanged本身

AddHandler this.PropertyChanged, AddressOf PropertyChanged 

PropertyChanged你可以檢查哪些屬性發生了變化,取決於您可以使用RaisePropertyChanged的問候

+0

我已經在我原來的問題中確認了這個確切的方法('我可以把OnPropertyChanged(「問候語」)放在FirstName和LastName的setter中)。我正在尋找一些不太緊密的東西。 – KyleMit

+0

看到我更新的答案,如果它可以幫助你 – Nitin

1

借用nit's answer,只是爲了圓一點。下面是我做對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 
  • 它處理的是已經作爲視圖模型的INotifyPropertyChanged接口的一部分實現的PropertyChanged事件。
  • 然後它檢查event參數的PropertyName值是否等於「FirstName」或「LastName」。
  • 如果是這樣,它會手動調出Greeting屬性的OnPropertyChanged()方法。