En essayant de faire apparaître le contenu d'une liste qui est une propriété de dépendance dans un menu contextuel WPF.Menu contextuel WPF lié à la propriété de dépendance List <>
J'ai une classe avec la propriété de dépendance suivante, une liste des Foo (données classe holding):
public List<Foo> FooList
{
get { return (List<Foo>)GetValue(FooListProperty); }
set { SetValue(FooListProperty, value); }
}
public static DependencyProperty FooListProperty =
DependencyProperty.Register("FooList", typeof(List<Foo>),
typeof(FooButton));
En XAML, je mis en place la ressource statique suivante, je suppose que son nécessaire depuis le isnt menu contextuel une partie de l'arbre visuel:
<UserControl.Resources>
<ResourceDictionary>
<CollectionViewSource
x:Key="FooListSource"
Source="{Binding FooList}"/>
<!-- ... -->
</ResourceDictionary>
</UserControl.Resources>
partie également de la ResourceDictionary ci-dessus est un CompositeCollection qui est nécessaire pour rendre les éléments apparaissent dans le menu contextuel réel. Si la propriété UserControl CanStop est true, nous affichons également un séparateur et une commande d'arrêt. Ces liaisons échouent également, bien que les MenuItems apparaissent eux-mêmes. Donc, si je peux comprendre pourquoi ces échecs, la liste pourrait être plus facile.
<CompositeCollection x:Key="FooListItems">
<CollectionContainer
Collection="{Binding Source={StaticResource FooListSource}}"/>
<Separator
Visibility="{Binding CanStop,
Converter={StaticResource VisibleIfTrue}}" />
<MenuItem
Command="{x:Static Buttons:FooButton.Stop}"
Header="Stop"
Visibility="{Binding CanStop,
Converter={StaticResource VisibleIfTrue}}"/>
</CompositeCollection>
Et enfin le menu contextuel lui-même, également dans le ResourceDictionary:
<ContextMenu
x:Key="FooButtonMenu"
ItemsSource="{Binding Source={StaticResource FooListItems}}"
ItemTemplate="{StaticResource FooListTemplate}"
<ContextMenu.CommandBindings>
<CommandBinding
Command="{x:Static Buttons:FooButton.Stop}"
Executed="Stop_Executed" />
</ContextMenu.CommandBindings>
</ContextMenu>
Je me sens moyen d'affichage Im à beaucoup de code, mais je ne suis pas sûr que je peux faire cette pièce plus simple. Seul le séparateur et le menuitem codé en dur apparaissent. Donc quelque chose doit être foiré avec les fixations. Les reliures ne sont généralement pas si difficiles mais maintenant quand je veux lier quelque chose qui ne fait pas vraiment partie du même arbre, je me sens un peu perdu.
Toutes les suggestions sont les bienvenues. :)
Comment utilisez-vous FooList DependencyProperty? En particulier, attribuez-vous une liste entièrement remplie à la propriété ou attribuez-vous une liste vide à la propriété, puis remplissez la liste par la suite? DependencyProperty va propager l'affectation à une liste complètement nouvelle, mais si vous voulez surveiller les changements dans la liste, vous devrez utiliser ObservableCollection ou une autre implémentation de INotifyCollectionChanged. –
Une fonction est appelée qui déclenche la lecture de données à partir d'un système hérité, je parcours les données en faisant 'FooList.Ajouter (myNewFoo); '. Êtes-vous en train de dire que je devrais simplement changer le 'List <>' pour un 'ObservableCollection <>'? – Mizipzor
Euh .. tout me semble ok! Pouvez-vous s'il vous plaît télécharger votre projet de démonstration quelque part? Peut-être qu'il vous manque un DataContext? – mg007