2013-10-23 205 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()方法。