2014-09-01 22 views
0

該項目:一個帶有「貼子」信息的小公告板。 VB.Net,VS2013,Windows 8.1桌面。棱鏡/ MVVM。Prism Windows 8.1 NotifyProperyChanged不會觸發?

問題: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"> 

此外,使用「報事貼」模板出現的音符,定義爲:與該的ItemsSource和性能

<prism:VisualStateAwarePage.Resources> 
    <DataTemplate x:Name="PostIt"> 
     <Grid Width="250" Height="250" > 
      <TextBlock 
       FontFamily="Buxton Sketch" 
       Text="{Binding Text}" 
       FontSize="20" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top" 
       Margin="20,40,50,0" 
       TextWrapping="WrapWholeWords"> 
      </TextBlock> 
     </Grid> 
    </DataTemplate> 
</prism:VisualStateAwarePage.Resources> 

最後的GridView中模板:

<GridView x:Name="grdMessages" 
    ItemsSource="{Binding Messages}" 
    ItemTemplate="{StaticResource PostIt}"/> 

到目前爲止在視圖中呈現的XAML。代碼隱藏只不過是一個簡單的構造函數初始化,它看起來像:

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

這都是非常簡單的,幸運的是,使用Prism庫來獲得更豐富的功能。下一部分是ViewModel,並且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 

的消息通過的WebAPI是存儲庫的一部分檢索,我敢肯定,這是工作的罰款。項目被正確讀取並傳遞給ViewModel。

當我遍歷代碼時,我看到消息到達和Set,並因此調用SetProperty。

但是消息沒有顯示在視圖上。在我看來,當檢索到消息時,View並未被通知更改。

這種方法有什麼問題?

回答

0

問題不在於這種方法,而是_Messages集合的本地版本不應該被聲明爲私有(property),而是作爲局部變量。因此,對於財產申報和本地版本的完整的語句應該是這樣的:

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將觸發事件和正確的價值觀將通過該視圖模型的綁定對象進行傳遞。

+0

我注意到這篇文章的一些downvotes。也許這篇文章沒有解決你的問題。但事實確實如此,這對其他人來說肯定是有價值的。如果它不包含解決方案,請繼續尋找其他答案。但是,我猜想沒有理由冷靜下來。你應該減少WRONG的帖子,幫助別人避免犯錯誤。 – 2014-10-12 20:31:48