0

プロジェクト: 「ポストイット」メッセージ付きの小さな掲示板。VB.Net、VS2013、Windows 8.1 デスクトップ。プリズム/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: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>

そして最後に、ItemsSource と Template のプロパティを持つ 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 に渡されます。

コードをステップ実行すると、メッセージが到着し、セットが表示され、したがって SetProperty が呼び出されます。

しかし、 Messages は View に表示されません。メッセージが取得されたときに、ビューに変更が通知されないように思えます。

このアプローチの何が問題なのですか?

4

1 に答える 1