2009-04-22 10 views
1

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!

Répondre

0

J'ai implémenté l'approche IValueConverter. La solution est documentée avec un projet de démonstration on The Code Project. J'espère que cela aidera d'autres personnes sur la route.

1

Pourquoi ne pas simplement exposer la Command du AlertViewModel à la place? Même s'il l'obtient réellement du modèle parent:

public class MainViewModel 
{ 
    private ICollection<AlertViewModel> _alerts = ...; 
    private ICommand _theCommand = ...; 

    public ICommand TheCommand 
    { 
     get { return __theCommand; } 
    } 

    private void SomeMethod() 
    { 
     _alerts.Add(new AlertViewModel(this)); 
    } 
} 

public class AlertViewModel 
{ 
    private readonly MainViewModel _mainViewModel; 

    //ctor omitted 

    public ICommand TheCommand 
    { 
     get { return _mainViewModel.TheCommand; } 
    } 
} 
+0

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. –

Questions connexes