0

我目前正在使用 prism IEventAggregator 在不同模块的两个视图之间试验 wpf 通信。发布模块和订阅模块工作正常,由于某种原因,我不明白为什么订阅者 UI 没有更新。我在订阅者模块上放置了一个按钮来显示一个 msgbox,以确保它接收到它并且它确实接收到它。我认为我正确实施了 INotifyPropertyChanged。

如果我将订阅放在订阅者视图的代码隐藏中,它可以按我的意愿工作....我做错了吗?请纠正我。谢谢。

用于模块消息传递的单独类。这门课来自这篇文章 http://www.shujaat.net/2010/12/wpf-eventaggregator-in-prism-40-cal.html

Public Class SendServices
Public Shared Property SendMessage As EventAggregator

Shared Sub New()
    SendMessage = New EventAggregator
End Sub
End Class

出版商:

Public Class Module1ViewModel

Private _msgsend As String
Public WriteOnly Property MessageSend As String
    Set(value As String)
        _msgsend = value
    End Set
End Property

Public Sub Send()
    SendServices.SendMessage.GetEvent(Of SendStringEvent).Publish(New SendString With {.Name = _msgsend})
End Sub
End Class

订户:

Public Class Module2ViewModel
Implements INotifyPropertyChanged

Private _receivedMSG As String
Public Property ReceivedMSG As String
    Get
        Return _receivedMSG
    End Get
    Set(value As String)
        _receivedMSG = value

        OnPropertyChanged("ReceivedMSG")
    End Set
End Property
'Binded to subscriber View button using interactions
Public Sub Received()
    MsgBox(ReceivedMSG)
End Sub

Private Sub ReceivedMessage(msg As SendString)
    _receivedMSG = msg.Name
End Sub

Public Sub New()
    SendServices.SendMessage.GetEvent(Of SendStringEvent)().Subscribe(AddressOf ReceivedMessage, ThreadOption.UIThread, False)
End Sub

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Protected Sub OnPropertyChanged(ByVal name As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
End Sub
End Class

订阅者查看代码隐藏

Public Class Module2View
    Sub New()
        InitializeComponent()
        Me.DataContext = New Module2ViewModel
    End Sub
End Class

以及显示消息的绑定部分

<TextBox Height="23" HorizontalAlignment="Left" Margin="111,39,0,0" Name="TextBox1" VerticalAlignment="Top" Width="158" Text="{Binding Path=ReceviedMSG}"/>
4

1 回答 1

1

您不会触发OnPropertyChanged事件,因为您直接_receivedMSG在处理程序中设置字段,绕过触发事件的属性设置器。

所以你应该改用属性设置器:

Private Sub ReceivedMessage(msg As SendString)
    ReceivedMSG = msg.Name
End Sub
于 2012-04-19T05:12:09.933 回答