Lier ObservableCollection utilisant MVVM

Je suis en train de mettre ensemble ce qui devrait être un très de base MVVM de l'échantillon, mais j'ai du mal à la faire fonctionner. En fait, je cherche à lier une ObservableCollection à un ListBox, et une option de recherche pour l'utilisateur à la recherche d'autres éléments. Sur la recherche, la ListBox doit être actualisé que la collection va changer. Voici mon code:

Modèle:

public class Item
   public string Name { get; set; }
}

ViewModel:

public class ViewModel : INotifyPropertyChanged
{
private ObservableCollection<Item> _items { get; set; }
public ObservableCollection<Item> Items
{
get { return _items; }
set
{
_items = value;
RaisePropertyChanged("Items");
}
}
public void GetDefaultItems()
{
ObservableCollection<Item> temp = new ObservableCollection<Item>();
temp.Add(new Item() { Name = "abc" + " 1" });
temp.Add(new Item() { Name = "def" + " 2" });
temp.Add(new Item() { Name = "ghi" + " 3" });
Items = temp;
}
public void Search(string query)
{
ObservableCollection<Item> temp = new ObservableCollection<Item>();
temp.Add(new Item() { Name = query + " 1" });
temp.Add(new Item() { Name = query + " 2" });
temp.Add(new Item() { Name = query + " 3" });
Items = temp;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

Vue:

<Grid x:Name="LayoutRoot">
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock x:Name="Name" Text="{Binding Name}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

De la page d'accueil.xaml:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<TextBox x:Name="txtSearch"/>
<TextBlock Text="Items:" />
<views:ItemView x:Name="ItemsOnPage" />
</StackPanel>
</Grid>

et enfin, la page d'accueil.xaml.cs:

public partial class MainPage : PhoneApplicationPage
{
private ViewModel vm;
//Constructor
public MainPage()
{
InitializeComponent();
txtSearch.KeyUp += txtSearch_KeyUp;
vm = new ViewModel();
}
void txtSearch_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
vm.Search(txtSearch.Text);
}
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
vm.GetDefaultItems();
ItemsOnPage.DataContext = vm.Items;
}
}

Donc ce qui se passe, je peux voir la valeur par défaut des éléments de charger la première fois, mais quand je fais une recherche, la liste ne pas vous rafraîchir. Il est tout codé en dur en ce moment donc si la recherche fonctionne que je devrais voir 3 articles pour tout ce qu'ils recherchent.

Ce que j'ai remarqué, c'est que si j'ai mis en place un point d'arrêt dans le ViewModel à RaisePropertyChanged, this.PropertyChanged est toujours null, de sorte qu'il ne se rend jamais à l'intérieur de la if déclaration. J'ai vu des exemples d'utilisation de INotifyPropertyChanged sur le modèle, mais dans ce cas, car j'ai besoin d'être notifié lors de la collecte des changements, il semble correct d'utiliser sur le modèle de vue. Ce qui pourrait être mauvais, mais je ne sais pas comment le configurer.

N'importe qui peut voir ce que je fais mal?

Essayez de mettre ItemsOnPage.DataContext = vm.Items; en de la page d'accueil de votre constructeur.
donc, il suffit de déplacer de OnNavigatedTo jusqu'à l'constructeur? J'ai essayé tout à l'heure, ne fait pas de différence.
peut-être vous avez besoin d'un autre événement pour windows-phone-8 je pense que je l'ai lu il y a un moment mais je ne suis pas tout à fait sûr, essentiellement, c'est parce que vous n'avez pas le plein .Net Lib de soutien pour les téléphones
Un grand exemple pour moi de mettre en œuvre un Xamarin forms viewmodel

OriginalL'auteur lhan | 2014-01-24