La mise en œuvre d'un contrôle ListView Filtre avec Josh Smith WPF MVVM Démo App
J'ai essayé de développer Josh Smith démo MVVM application dans le but de mieux comprendre les principes derrière elle et je l'ai frappé un mur en essayant de mettre en œuvre une fonction de filtre sur une Vue à l'aide d'une ListView.
J'ai passé quelques heures de recherche et de la surface mais sa ne marche pas.
Ma première étape a été de lier une zone de texte à mon avis, à un bien dans mon ViewModel:
<TextBox Height="25" Name="txtFilter" Width="150" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
Cela correspond à ma VM:
public string Filter
{
get { return this.filter; }
set
{
this.filter = value;
OnFilterChanged();
}
}
Ma VM utilisé une ObservableCollection de la source de données, mais j'ai essayé de le convertir en un ICollectionView après la lecture de tutoriels:
internal ObservableCollection<StaffViewModel> InnerStaff { get; set; }
internal CollectionViewSource CvsStaff { get; set; }
public ICollectionView AllStaff
{
get { return CvsStaff.View; }
}
Dans mon constructeur, j'ai précisé:
CvsStaff = new CollectionViewSource();
CvsStaff.Source = this.InnerStaff;
CvsStaff.Filter += ApplyFilter;
Lors de mon Filtre de la Propriété est mise à jour il appelle OnFilterChanged qui est:
private void OnFilterChanged()
{
CvsStaff.View.Refresh();
}
Mon ApplyFilter Fonction est:
void ApplyFilter(object sender, FilterEventArgs e)
{
StaffViewModel svm = (StaffViewModel)e.Item;
if (this.Filter.Length == 0)
{
e.Accepted = true;
}
else
{
e.Accepted = svm.LastName.Contains(Filter);
}
}
Est-il une bête erreur que j'ai faite que quelqu'un peut m'aider? Je suis assez nouveau à WPF et le modèle MVVM donc je suis encore à apprendre!
MODIFIER
Dans la Vue je la lie de la collection:
<CollectionViewSource
x:Key="StaffGroup"
Source="{Binding Path=AllStaff}"
/>
et la liste est en tant que tel:
<ListView
Name="staffList"
AlternationCount="2"
DataContext="{StaticResource StaffGroup}"
ItemContainerStyle="{StaticResource StaffItemStyle}"
ItemsSource="{Binding}"
Grid.Row="1">
s'il vous plaît partagez votre ListView Code XAML
Sa ne fonctionne pas aussi bien que le OnFilterChanged méthode est appelée, la liste n'est pas actualisé et qu'il ne montre pas les résultats du filtre
OriginalL'auteur Alex Naish | 2012-08-30
Vous devez vous connecter pour publier un commentaire.
La liaison est incorrect. Vous avez besoin de faire quelques changements. La première chose est de s'assurer que le DataContext est défini correctement. Typiquement, vous allez le faire sur un parent de la liste et ne pas fixer directement sur le contrôle ListView. Cela pourrait être un UserControl /Fenêtre /etc.
Donc, en supposant que vous avez un modèle de vue:
Et en supposant que vous avez une Fenêtre MainWindow.cs (code derrière) vous pouvez (pour cet exemple) brancher le DataContext ici.
Alors vous avez un peu de choix pour faire de votre liaison, vous pouvez spécifier votre objet collectionviewsource en XAML ou dans le code, mais vous avez fait les deux. c'est à dire le code xaml, avec la touche x:key="StaffGroup" et la VM une CvsStaff. Disons que nous nous débarrassons de la xaml un tout et l'utilisation de la machine virtuelle, qui est configuré correctement. Ensuite, vous lier à l'aide de la propriété ItemsSource, comme suit:
Aussi petite chose, j'ai changé le Filtre à vérifier pour les valeurs null et les espaces. Vous pouvez aussi avoir besoin de passer à être sensible à la casse.
Une autre chose que je n'ai pas mentionné ici, mais c'est important pour implémenter INotifyPropertyChanged sur votre StaffViewModel - je suppose que vous avez, si ce n'est pas ici un code. En règle générale, vous aussi le faire sur la plupart des modèles de vue, pour notifier l'affichage des modifications apportées aux propriétés.
Fantastique explication! Qui est très pédagogique, et le concept a fonctionné comme un charme pour moi.
Très bien expliqué. Pouvez-vous juste me dire quoi faire, quand je veux appliquer le filtre sur le nom complet d'ailleurs sur le nom de famille.
OriginalL'auteur SDK