2016-08-12 8 views
0

を動作していないユーザーコントロールの監視可能なコレクションにバインド:NewsPageUWPが、私はこのページを持っている

<Page 
x:Class="TouchTypeRacing.Views.NewsPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:TouchTypeRacing.Views" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:controls="using:TouchTypeRacing.Controls" 
xmlns:models="using:TouchTypeRacing.Models" 
DataContext="{Binding}" 
mc:Ignorable="d"> 

<Grid Background="White"> 
    .... 
    <ScrollViewer Grid.Row="1" 
        VerticalScrollBarVisibility="Auto" 
        Margin="5,10,5,0"> 
     <ItemsControl ItemsSource="{Binding Posts}" 
         x:Name="itemsControl"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Vertical"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate x:DataType="models:Post"> 
        <controls:Post/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 
</Page> 

ページのDataContextのは、ビューモデルにバインドされています。 PageViewmModel
ItemsControlデータテンプレートは、Postコントロールです。
ページ上のItemsControlItemsSourceは、ビューモデルのPostsプロパティにバインドされています。

public NewsPage() 
{ 
    this.InitializeComponent(); 

    _viewModel = new NewsPageViewModel(); 
    DataContext = _viewModel;   
} 

そして、ビューモデルは:

public class NewsPageViewModel 
{ 
    private ObservableCollection<Post> _posts = new ObservableCollection<Post>(); 
    public ObservableCollection<Post> Posts { get { return _posts; } } 
    public NewsPageViewModel() 
    { 
     GetPosts(_posts); 
    } 
    public static void GetPosts(ObservableCollection<Post> posts) 
    { 
     posts.Clear(); 
     posts = new ObservableCollection<Post> 
     { 
      new Post 
      { 
       Id = "1", 
       DateTime = DateTime.Today, 
       User = Application.CurrentUser, 
       Likes = 10, 
       ImagePath = Application.CurrentUser.ImagePath, 
       Message = "Test message", 
       Comments = new ObservableCollection<Comment> 
       { 
        new Comment {Id= "1", Content="Comment1", User = Application.CurrentUser }, 
        new Comment {Id= "2", Content="Comment2", User = Application.CurrentUser }, 
        new Comment {Id= "3", Content="Comment3", User = Application.CurrentUser }, 
        new Comment {Id= "4", Content="Comment4", User = Application.CurrentUser }, 
       }, 
       Last2Comments = new List<Comment> 
       { 
        new Comment {Id= "3", Content="Comment3", User = Application.CurrentUser }, 
        new Comment {Id= "4", Content="Comment4", User = Application.CurrentUser }, 
       } 
      } 
     }; 
    } 

ItemsControlが空に現れます。 私は何が間違っていますか?

答えて

0

コレクションの切り替えを維持する場合は、NewsPageViewModelINotifyPropertyChangedを実装し、コレクションインスタンスを変更するときはPropertyChangedにする必要があります。それはどのように行くのです。私は、以下にはるかに簡単な「クイックフィックス」ソリューションも含めました。

public class VIewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged([CallerMemberName] String propName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

public class NewsPageViewModel : ViewModelBase 
{ 
    public NewsPageViewModel() 
    { 
     Posts = GetPosts(); 
    } 

    private ObservableCollection<Post> _posts; 
    public ObservableCollection<Post> Posts 
    { 
     get { return _posts; } 
     set { 
      _posts = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected ObservableCollection<Post> GetPosts() 
    { 
     // do stuff to get posts, return new ObservableCollection<Post> 
    } 
} 

クイックフィックス

簡単にUIは何か、それはPostsの値をつかむ最初の(この場合では、ONLY)時刻を取得しますので、コレクションのインスタンスから始めることです、同じコレクションを維持します。しかし、INotifyPropertyChangedがなければ、あなたはこのような問題の最後に遭遇するでしょう。 WPFを使用せずにWPFを使用しようとすると、実際には自己罰の練習になります。

ObservableCollection<Post> _posts = new ObservableCollection<Post>(); 

public ObservableCollection<Post> Posts { get { return _posts; } } 
public NewsPageViewModel() 
{ 
    GetPosts(_posts); 
} 
public static void GetPosts(ObservableCollection<Post> posts) 
{ 
    posts.Clear(); 
    // ...get posts 
} 

特別なことを約ObservableCollectionそれはあなたがコレクションから項目を追加または削除する場合UIを通知しますINotifyCollectionChangedを実装していることである - しかし、UIが変更に耳を傾けるためにどのコレクション知っている必要があります。

+0

まだ何も表示されません。私はあなたのquickfixのようにViewmodelを編集しました。チェックを編集します – shadowCODE

+0

@shadowCODE 'posts.Clear()'を呼び出した後、それを投げ捨て、パラメータを新しいコレクションに置き換えます。それをしないでください。それはあなたがそれを行うメソッドの外には何の効果もありません。投稿をOLDコレクションに入れてください。その修正が機能するには、SAMEコレクションを保持する必要があります。そのコードでは、あなたが始めるコレクションは、UIがこれまでに知る唯一のコレクションです。投稿が入る必要があるのはこれです。これが大きな解決策ではない理由の1つです。 –

+0

@shadowCODE上記の「自己罰の行使」を参照してください。 –

0

私はそう...コメントはまだありません追加することはできません。

をNewsPageViewModelのコンストラクタでは、新しい(しかし空)のObservableCollectionを初期化します。

GetPost-Methodで要素を追加しない場合、_postsは空のままです。

関連する問題