8
votes

DataContext multiple pour une commande - MVVM

Je ne suis pas sûr que mon en-tête de question représente exactement mon problème, je ferai le mieux pour expliquer:

J'ai un fichier de données de cellule de grille: (la grille appartient à une entreprise tierce, mais ce n'est pas important pour mon Question) p>

<DataTemplate>
    <TextBlock>
        <Hyperlink Command="{Binding OpenLinkCommand}"> 
            <Hyperlink.ToolTip>
                <TextBlock Text="{Binding Data.MapLink}"/>
            </Hyperlink.ToolTip>
            <TextBlock Text="{Binding Data.MapLink}" TextDecorations="underline">
        </Hyperlink>
    </TextBlock>
</DataTemplate>


3 commentaires

D'où vient le deuxième datacontext? est-il lié à un élément parce que vous pouvez lier un élément dataContext sur un autre et définir simplement la source relative. Si vous avez accès à DataContext dans votre modèle de vue (en supposant que vous utilisiez un point de vue), vous pouvez tirer dans l'autre commande.


Utilisez RelateSource dans votre liaison pour trouver le bon DataContext


Je viens de rappeler le bogue (une autre fois?) À Microsoft: Connect.Microsoft.com/visualstudio/feedback/Détails/1398835/ ...


3 Réponses :


0
votes

Vous devrez avoir une instance du contexte de données souhaité (généralement dans les ressources d'une commande ou d'une fenêtre). Une fois que vous aurez cela, vous devriez être capable de définir explicitement le contexte de données du texte de texte au lieu d'hériter automatiquement le contexte de données parent automatiquement.

Par exemple: P>

<TextBlock DataContext="{StaticResource MyDataMapLinkDataContext}" Text="{Binding Data.MapLink}" TextDecorations="underline"/>


4 commentaires

Oui, j'ai pensé à cette façon mais je ne peux pas créer une autre instance DataContext (mon DataContext doit être singleton). Toute autre suggestion?


Vous pouvez lier votre lien hypertexte vers le contexte de données parent en utilisant Relative Source Findancestor. Le code de liaison exacte dépend de la manière dont vous avez structuré votre XAML. Peut-être publier votre XAML si vous avez besoin d'aide avec cela.


En outre, vous avez dit que vous ne pouvez pas mettre les deux commandes dans le même DataContext, si vous utilisez MVVM, vous pouvez envelopper les deux modèles d'affichage dans une troisième et exposez les deux commandes.


Programme échoué - Si j'ai bien compris votre solution, il n'est pas bon. Si je ferai que le commandement fonctionnera (comme je l'ai dit auparavant) mais mon lien hypertexte gagné T avoir accès data.maplink Valeur Veuillez également redevoir - je n'ai que 1 commandement. L'autre élément pour lier sa propriété qui me donne une valeur de lien



0
votes

Si vous avez vraiment besoin d'utiliser une autre propriété pour un contexte de données supplémentaire, vous pouvez simplement utiliser une propriété attachée.

xaml xxx

code xxx


0 commentaires

20
votes

Il existe certaines propriétés de liaison que vous pouvez utiliser pour spécifier une source code> différente code> pour votre reliure que la valeur par défaut dataContext code>

Les plus courants sont ElementName ou RelativeVource code>, qui trouvera un autre élément UI dans la Visualtree afin que vous puissiez se lier à ses propriétés. p>

Par exemple, les utilisations suivantes ELEMENTNAME CODE> Pour indiquer à la liaison qu'il doit utiliser MyGridView code> comme source de liaison et pour se lier à MygridView .DataContext.openlinkCommand code> p> xxx pré>

Vous pouvez également utiliser RelativeVource code> dans une liaison pour trouver un objet supplémentaire de l'objet VisualTree de l'objet spécifié de l'objet spécifié Tapez et utilisez-le comme source de liaison. Cet exemple fait la même chose que l'exemple ci-dessus, sauf qu'il utilise RelativeVource code> au lieu de ElementName code>, donc votre gridview code> n'a pas besoin d'avoir un nom code> spécifié. p>

<Hyperlink Command="{Binding 
               Source={x:Static local:MyStaticClass.OpenLinkCommand}}"> 


1 commentaires

Bonjour, votre solution semble être comme ce que je cherche. Je vais essayer aujourd'hui et signaler s'il résolu mon problème.