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?
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éphonesUn grand exemple pour moi de mettre en œuvre un Xamarin forms viewmodel
OriginalL'auteur lhan | 2014-01-24
Vous devez vous connecter pour publier un commentaire.
essayer de faire ce
ensemble ItemSource à des Éléments
Claire et Ajouter des Éléments de Données
Espère que cette aide.
RaisedPropertyChanged
ne pas être touché, mais les valeurs sont toujours mis à jour correctement. Si cela devait se produire?Ce que je veux dire, c'est que, ai-je besoin de mettre en œuvre
INotifyPropertyChanged
pour cela? À partir de la liste des éléments sur la page, l'utilisateur ne sera pas en mesure de les modifier de sorte que je ne pas besoin de re-lier dans l'autre sens. La seule chose que j'ai besoin de faire avec chacun des éléments de la liste est de leur donner un gestionnaire d'événements ainsi, par exemple, en tapant sur on pourrait vous prendre pour une autre page.techniquement, vous n'avez pas besoin de mettre en œuvre
INotifyPropertyChanged
dans ce cas. C'est parce que laObservableCollection
implémenteINotifyCollectionChanged
, qui les informe sur la vue lorsque vous Ajouter, Effacer, etc.OriginalL'auteur AlexisXu
Il ressemble à de la valeur des articles de la collection n'est pas en cours d'actualisation sur l'INTERFACE utilisateur.
Essayer ce-
Code dans de la page d'accueil.cs
De La Page D'Accueil Constructeur
De liaison en de la page d'accueil XAML
ListBox
en Vue.xaml aucun liaison (autres que pour laName
dans leTextBlock
)?Je pense qu'il ne faut pas en cas de problème, vous pouvez le lier avec toute propriété que vous voulez, tant que la propriété appartient à son datacontext.
OriginalL'auteur Ramashankar