0

Greeting主に と という 2 つのバインドされたプロパティで構成されるプロパティがある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")のセッターを入れることもできましたが、これは間違っているように感じます。より複雑な例では、何かが変更されたときに各オブジェクトがそれ自体を更新するだけの処理を行います。 FirstNameLastName

Q:)プロパティを構成するプロパティの 1 つが変更された場合、そのプロパティ を強制的に更新できReadOnlyますか?

4

2 に答える 2

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
  • ViewModelPropertyChangedのインターフェイスの一部として既に実装されているイベントを処理します。INotifyPropertyChanged
  • PropertyName次に、イベント引数の値が「FirstName」または「LastName」と等しいかどうかをチェックします。
  • OnPropertyChanged()その場合は、プロパティのメソッドを手動で発生させGreetingます。
于 2013-10-23T19:44:01.050 に答える
1

FirstName と LastName のセッターから Greetings の PropertyChanges を呼び出すことができます

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

また

PropertyChangedViewModel 自体をサブスクライブできます

AddHandler this.PropertyChanged, AddressOf PropertyChanged

そして、PropertyChangedグリーティングのRaisePropertyChangedができることに応じて、どのプロパティが変更されたかを確認できます

于 2013-10-23T17:51:44.390 に答える