Ceci est similaire à une question que j'ai posée il y a quelques jours. Cependant, j'ai maintenant une meilleure compréhension du problème, donc je voudrais faire une autre tentative.Liens hypertexte ListBox - Invocation ICommands
Je crée une application qui MVVM (entre autres choses) affiche une zone de liste avec des alertes pour l'utilisateur. Ces alertes se rapportent à diverses tâches de routine qui doivent être effectuées périodiquement, et chaque alerte contient un lien hypertexte qui, lorsqu'il est cliqué, ouvre l'éditeur et l'enregistrement nécessaires pour effectuer la tâche liée à l'alerte.
Mon problème se pose lorsque je tente de lier ces hyperliens vers ICommands. Les commandes de l'application sont toutes des objets ICommand et sont exposées en tant que propriétés de commande dans le modèle de vue. Donc, normalement, la liaison à une commande est aussi simple que Command = "Foo", où Foo est une propriété de commande de vue.
Mais cela ne fonctionnera pas pour mes hyperliens. Voici pourquoi: Le ListBox est lié, à travers sa propriété ItemsSource, à une propriété de collection dans le modèle de vue appelé Alertes. Cette collection est constituée d'objets Alert, qui contiennent les informations nécessaires pour créer les alertes et leurs liens hypertexte associés.
Cependant, étant donné que ListBox est lié à la collection Alertes, ses éléments ont uniquement accès à cette collection, et pas au reste du modèle de vue! En d'autres termes, mes liens hypertexte n'ont pas accès aux propriétés de commande auxquelles ils doivent se lier. Commande = Foo ne fonctionne tout simplement pas, car WPF ne trouve pas de propriété Foo dans la collection Alertes, même si le modèle de vue possède une propriété de commande portant ce nom.
Je peux travailler autour de ce avec un hack assez laid qui consiste à utiliser un IValueConverter instancier les ICommands j'ai besoin. Le lien hypertexte se lie au nom de l'ICommand dont il a besoin (à partir de l'objet Alert) et IValueConverter échange le nom d'une nouvelle instance de l'ICommand lui-même.
Je ne suis pas vraiment content de cette solution. J'ai essayé de comprendre comment créer des ressources à partir des propriétés de commande de modèle de vue, afin que je puisse lier les commandes de lien hypertexte comme ceci:
<Hyperlink Command={StaticResource Foo} />My Hyperlink</Hyperlink>
Mais je ne peux pas comprendre comment créer la ressource.
Toutes les suggestions sur la façon de résoudre ce problème serait grandement apprécié. Merci de votre aide!
Merci! Idée intéressante - mais j'ai encore besoin de définir la propriété ItemsSource à une collection dans le AlertViewModel pour obtenir le ListBox rempli, et cela déconnecte les liens hypertexte des commandes exposées par le AlertViewModel. –