Mvvm Prism Windows 8.1 NotifyPropertyChanged未启动?

Mvvm Prism Windows 8.1 NotifyPropertyChanged未启动?,mvvm,prism-5,Mvvm,Prism 5,项目:一个带有“发布”信息的小布告栏。VB.Net、VS2013、Windows 8.1桌面。Prism/MVVM 问题:当属性更改时,NotifyPropertyChanged事件似乎根本不会触发。这些信息也不会出现在布告栏上 问题:为什么会这样?或者:下面的代码有什么问题? 代码: 首先,我们有观点。它的定义如下: <prism:VisualStateAwarePage x:Name="pageRoot" x:Class="MemoBoard.Views.BoardP

项目:一个带有“发布”信息的小布告栏。VB.Net、VS2013、Windows 8.1桌面。Prism/MVVM

问题:当属性更改时,NotifyPropertyChanged事件似乎根本不会触发。这些信息也不会出现在布告栏上

问题:为什么会这样?或者:下面的代码有什么问题?

代码

首先,我们有观点。它的定义如下:

<prism:VisualStateAwarePage 
    x:Name="pageRoot"
    x:Class="MemoBoard.Views.BoardPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="using:Microsoft.Practices.Prism.StoreApps"
    prism:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d">
这一切都非常简单,谢天谢地,使用Prism库可以获得更丰富的功能。下一部分是ViewModel,而且ViewModel非常简单,是书外的。 它看起来像:

Namespace Views
    Public NotInheritable Class BoardPage
        Inherits VisualStateAwarePage
        Public Sub New()
            InitializeComponent()
        End Sub
    End Class
End Namespace
Namespace ViewModels
    Public Class BoardPageViewModel
    Inherits ViewModel

    Private _MessageRepository As IMessageRepository
    Private Property _Messages As ObservableCollection(Of Message)
    Public Property Messages As ObservableCollection(Of Message)
        Get
            Return _Messages
        End Get
        Set(value As ObservableCollection(Of Message))
                SetProperty(_Messages, value)
            End Set
    End Property

    Public Overrides Async Sub OnNavigatedTo(navigationParameter As Object, navigationMode As NavigationMode, viewModelState As Dictionary(Of String, Object))
        MyBase.OnNavigatedTo(navigationParameter, navigationMode, viewModelState)
        _MessageRepository = New MessageRepository
        Messages = Await _MessageRepository.GetMessagesAsync()
    End Sub

    End Class
End Namespace
这些消息是通过作为存储库一部分的WebAPI检索的,我确信它工作正常。正确读取项目并将其传递给ViewModel

当我一步一步地浏览代码时,我看到消息到达并且集合,因此调用了SetProperty

但这些消息不会显示在视图上。在我看来,在检索消息时,视图似乎没有收到更改通知


这种方法有什么问题?

问题不在于方法,而在于_Messages集合的本地版本不应声明为私有(属性),而应声明为本地变量。因此,财产声明的完整声明和本地版本应如下所示:

Dim _Messages As ObservableCollection(Of Message)
Public Property Messages As ObservableCollection(Of Message)
    Get
        Return _Messages
    End Get
    Set(value As ObservableCollection(Of Message))
            SetProperty(_Messages, value)
        End Set
End Property

现在SetProperty将触发事件,正确的值将传递给ViewModel的绑定对象。

我注意到这篇文章中有一些反对票。也许这篇文章并没有解决你的问题。但事实上,它肯定对其他人有价值。如果它不包含您问题的解决方案,请继续寻找其他答案。但我想这并不是否决投票的理由。你应该否决错误的帖子,帮助别人避免犯错。
Namespace ViewModels
    Public Class BoardPageViewModel
    Inherits ViewModel

    Private _MessageRepository As IMessageRepository
    Private Property _Messages As ObservableCollection(Of Message)
    Public Property Messages As ObservableCollection(Of Message)
        Get
            Return _Messages
        End Get
        Set(value As ObservableCollection(Of Message))
                SetProperty(_Messages, value)
            End Set
    End Property

    Public Overrides Async Sub OnNavigatedTo(navigationParameter As Object, navigationMode As NavigationMode, viewModelState As Dictionary(Of String, Object))
        MyBase.OnNavigatedTo(navigationParameter, navigationMode, viewModelState)
        _MessageRepository = New MessageRepository
        Messages = Await _MessageRepository.GetMessagesAsync()
    End Sub

    End Class
End Namespace
Dim _Messages As ObservableCollection(Of Message)
Public Property Messages As ObservableCollection(Of Message)
    Get
        Return _Messages
    End Get
    Set(value As ObservableCollection(Of Message))
            SetProperty(_Messages, value)
        End Set
End Property