ListBox selectedItem obtenir un travail, mais pas de travail dans MVVM
Je suis en train de travailler sur une application WPF et à la suite de MVVM. À mon avis, il y a une grille qui contient des colonnes différentes. L'une de ces colonnes est une zone de liste. Maintenant problème c'est que pour la zone de liste de la colonne, SelectedItem obtenir fonctionne très bien mais le jeu ne fonctionne pas.
Voici mon code d'Affichage
<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Header="Name" />
<DataGridTemplateColumn Header="Actions">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListBox DisplayMemberPath="Name" ItemsSource="{Binding Actions}" SelectedItem="{Binding SelectedAction}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Dans mon ViewModel, j'ai ViewModel Principal de la classe, qui contient une liste d'Éléments. Classe de l'élément contient le nom, une liste d'activités et de l'action sélectionnée.
public class MyViewModel : INotifyOfPropertyChanged
{
private ObservableCollection<Item> _items;
public ObservableCollection<Item> Items
{
get { return _items?? (_items= new ObservableCollection<Item>); }
}
private Item _selectedItem;
public Item SelectedItem
{
get { return _selectedItem; }
set { _selectedItem= value; }
}
}
public class Item : INotifyOfPropertyChanged
{
public string Name;
private ObservableCollection<string> _actions;
public ObservableCollection<string> Actions
{
get { return _actions?? (_actions= new ObservableCollection<string>); }
}
private string _selectedAction;
public string SelectedAction
{
get { return _selectedAction; }
set { _selectedAction = value; }
}
}
Maintenant SelectedItem pour les Éléments de liste fonctionne très bien. Mais SelectedItem insde de classe de l'Élément pour les Actions qui ne fonctionne pas complètement. J'ai inséré des points d'arrêt sur les getter et setter de SelectedAction. obtenez point d'arrêt est atteint. Mais si je sélectionne une action à partir de l'INTERFACE de définir un point d'arrêt pour SelectedAction ne pas se faire frapper.
Quel est le problème.
Lorsque je sélectionne Projet d'Archives ou de Rétablir le Projet, poseur de SelectedAction n'est pas appelée.
REMARQUE: j'ai supprimé les informations inutiles comme le chargement des données dans des listes, la mise en œuvre de INotifyOfPropertyChanged etc.
- vous post "Maintenant SelectedItem pour les Éléments de liste fonctionne très bien..." où est cette partie de code, qui fonctionne bien?
- dans MyViewModel classe. SelectedItem.
- Grille de données en vue est lié à des Éléments (Liste) MyViewModel classe.
- que signifie SelectedItem de MyViewModel fonctionne bien?
- "Mais SelectedItem insde de classe de l'Élément pour les Actions qui ne fonctionne pas complètement." Et où est la partie de code qui ne fonctionne pas?
- Oui. Mais pour des Actions selectedItem ne fonctionne pas.
- Avez-vous également supprimé le code qui appelle la INotifyOfPropertyChanged manifestation en cas de valeur de la propriété de changer?
- chaîne SelectedAction" ici. Il pourrait être source de confusion. Il y a une liste d'Élément(Classe). Dans la classe de l'Élément, il existe une autre liste. La liste interne ne fonctionne pas.
- Le Code est mis en œuvre, mais je n'ai pas écrit ici.
- Oui c'est confus pour moi
- juste pour s'assurer que nous entendons la même chose... vous avez quelque chose comme si (PropertyChanged != null) { PropertyChanged(ce, nouveau PropertyChangedEventArgs(propertyName)); } dans votre setters?
- Non, ce n'est pas présente dans setter.
- ces lignes sont présentes dans la classe, mais je n'appelle pas NotifyOfPropertyChange dans SelectedAction setter.
- Avez-vous essayé de mise en œuvre de
IEditableObject
dans votre classe de l'Élément? - nope. Je n'ai pas la moindre idée à ce sujet.
- Essayez de mettre en place quelque chose comme dans cette msdn lien: msdn.microsoft.com/en-us/library/.... Je ne peux pas garantir de bien, mais il semble une exigence pour la grille d'édition
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si c'est votre cas, mais puisque vous avez dit que vous venez de couper quelques informations je vais essayer de répondre.
cela m'arrive à moi quand j'ajoute un custum modèle à une zone de liste ou ListView, et que les contrôles à l'intérieur de la ListBoxItem gérer l'événement click eux-mêmes.
Par exemple, si vous avez un bouton radio comme ce
La SelectedItem ne sera pas définie lorsque vous actuellement cliquez sur le bouton radio parce que le bouton radio permet de gérer l'événement click et ne sera pas de bulle pour la zone de liste peut changer c'est la sélection.
Vous avez à faire assurez-vous que la zone de liste obtenez de l'événement et que les contrôles dans le modèle de réagir en conséquence. dans ce cas, vous aurez à faire quelque chose comme cela.
Vous devez spécifier un Dialogue de Liaison sur la SelectedItem. Sinon modifications ont été apportées à l'INTERFACE utilisateur de ne pas transmises à votre viewmodel.
La propriété SelectedItem de la MyViewModel classe n'utilise pas l'interface INotifyPropertyChanged par le relèvement de l'événement PropertyChanged lorsque le setter changé sa valeur:
Vous devez faire cela pour toutes les propriétés de tous les ViewModels.
Voici le correctif. Nous avons besoin de définir UpdateSourceTrigger de la zone de liste pour selectedItem,
je ne sais pas si je suis sur la bonne voie, mais avez-vous essayer d'envelopper votre chaîne de caractères dans une classe?
Regarder dans la Fenêtre de Sortie VS. Probablement votre type de propriété diffère du type d'élément.
N'est pas seulement "Erno roks" droit de réponse, vous devez notifier le changement de propriété sur votre sélection de propriétés, mais aussi WPF grille de données sont le plus buggé de contrôle offerts par Microsoft par rapport à MVVM.
Vous remarquerez que la propriété SelectedItem de la innerlist de mettre à jour, uniquement lorsque vous modifiez la sélection de la liste externe. L'actualisation en direct lorsque l'intérieur de la liste de changement de sélection, vous avez besoin de changer votre liaison sur la liste pour l'ajouter à ceci:
SelectedItem="{Binding SelectedAction, UpdateSourceTrigger=PropertyChanged}"
Ce n'est pas nécessaire lorsque la zone de liste n'est pas incorporé dans une colonne de grille de données.