【问题标题】:Binding / relating properties of two ViewModels to each other将两个 ViewModel 的属性相互绑定/关联
【发布时间】:2019-02-15 09:18:08
【问题描述】:

我直接从一张图片开始,展示我拥有的结构,这样我就可以用图片来提问。

我有一个这样的ParentModel

Public Class ParentModel
    public Property ModelValue_A As String
    Public Property ModelValue_B As String
End Class

我有一个ParentViewModel,它有两个ChildViewModel 类型的属性。

Public Class ParentViewModel
    Public Property Parent As ParentModel
    Public Property ChildViewModel_A As ChildViewModel
    Public Property ChildViewModel_B As ChildViewModel

    Sub New
        ChildViewModel_A = New ChildViewModel()
        ChildViewModel_B = New ChildViewModel()
    End Sub
End Class

我的ParentView是这样的:

<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <ContentPresenter Content="{Binding ChildViewModel_A}"/>
        <ContentPresenter Content="{Binding ChildViewModel_B}"/>
    </StackPanel>
</DataTemplate>

我的ChildViewModel是这样的:

Public Class ChildViewModel
    Private _ChildValue As String

    Public Property ChildValue As String
        Get
            Return _ChildValue
        End Get
        Set
            _ChildValue = Value
            NotifyPropertyChanged(NameOf(ChildValue))
        End Set
End Class

我的ChildView是这样的:

<DataTemplate>
    <TextBox Text="{Binding ChildValue}" />
</DataTemplate>

我的NotifyPropertyChanged 方法:

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Protected Sub NotifyPropertyChanged(info As [String])
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub

当我启动应用程序时,我得到一个类似于上图的视图。在那里,我可以通过输入ChildViewTextBox 来更改ChildValue。但是,我仍然没有每个ChildValue 与其对应的ParentViewModel 属性之间的连接/关系:ChildViewModel_AChildViewModel_B

我的问题是:如何通过更改ChildValueChildViewModel_A 来更改ModelValue_A,并分别通过更改ChildViewModel_BChildValue 来更改ModelValue_B? p>

【问题讨论】:

  • ParentViewModel 可以订阅 2 个 NotifyPropChanged 事件。您必须在某处为拆分 PropA / PropB 编码。
  • @HenkHolterman “订阅 2 个 NotifyPropChanged 事件”是什么意思?

标签: .net wpf vb.net mvvm


【解决方案1】:

您可以在ParentViewModel 类中为ChildViewModel(s) 连接一个事件处理程序到PropertyChanged 事件,并在这个类中设置ParentModel 的属性:

Public Class ParentViewModel
    Public Property Parent As ParentModel
    Public Property ChildViewModel_A As ChildViewModel
    Public Property ChildViewModel_B As ChildViewModel

    Sub New()
        ChildViewModel_A = New ChildViewModel()
        ChildViewModel_B = New ChildViewModel()

        AddHandler ChildViewModel_A.PropertyChanged, AddressOf OnPropertyChangedA
        AddHandler ChildViewModel_B.PropertyChanged, AddressOf OnPropertyChangedB

    End Sub

    Private Sub OnPropertyChangedA(sender As Object, e As PropertyChangedEventArgs)
        Parent.ModelValue_A = ChildViewModel_A.ChildValue
    End Sub

    Private Sub OnPropertyChangedB(sender As Object, e As PropertyChangedEventArgs)
        Parent.ModelValue_B = ChildViewModel_B.ChildValue
    End Sub
End Class

【讨论】:

  • 非常感谢您的回复。我尝试了您的解决方案,但 OnPropertyChangedAOnPropertyChangedB 没有被调用。我需要以特殊方式实现PropertyChanged 事件吗?
  • ChildViewModel 类必须实现INotifyPropertyChanged 接口并引发更改通知。你还没有发布你的NotifyPropertyChanged 方法。
  • 是的,你是对的。所有类实际上都实现了INotifyPropertyChanged。我在问题中添加了我的 NotifyPropertyChanged 方法。
  • @Yvonnila:你怎么知道事件处理程序没有被调用?您是否尝试在方法中放置断点?它对我来说很好用,所以你显然做错了什么或者没有给出完整的画面。
  • 是的,我在方法中设置了一个断点并更改了ChildValues。调用了对应的ChildValues 的setter,但没有调用eventhandlers。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多