2010-04-16 4 views
6

Est-il possible d'associer une commande à un DataGridHyperlinkColumn? Je l'ai essayé ceci:Existe-t-il un moyen d'associer une commande à une boîte à outils WPF DataGridHyperlinkColumn?

<DataGridHyperlinkColumn Header="Client Name" Binding="{Binding ShortName}"> 
    <DataGridHyperlinkColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Hyperlink.Command" 
            Value="{Binding DataContext.NavigateToClientCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ClientsSummaryView}}}"/> 
          <Setter Property="Hyperlink.CommandParameter" Value="{Binding}"/> 
         </Style> 
        </DataGridHyperlinkColumn.ElementStyle> 
    </DataGridHyperlinkColumn> 

Lors de l'exécution, je peux voir que la liaison est en cours d'évaluation correctement (le getter de la propriété pour la commande est appelée), mais la commande est exécutée lorsque je clique sur le lien hypertexte. Y a-t-il une meilleure manière de faire cela?

Merci,

Daniel

Répondre

10

Etes-vous sûr que la commande est associée à l'hyperlien? J'ai essayé d'installer ceci dans un exemple d'application, et la commande n'était pas associée au lien hypertexte (si vous renvoyez faux de CanExecute, vous serez en mesure de déterminer rapidement s'il est câblé).

Au lieu de cela, j'ai créé un DataGridTemplateColumn pour y arriver:

<DataGridTemplateColumn Header="Client Name"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <Hyperlink Command="{Binding DataContext.NavigateToClientCommand, RelativeSource={RelativeSource AncestorType={x:Type local:ClientsSummaryView}}}" 
          CommandParameter="{Binding ShortName}"> 
        <TextBlock Text="{Binding ShortName}" /> 
       </Hyperlink> 
      </TextBlock> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Cela obtiendrait vraiment ennuyeux si vous deviez créer plusieurs colonnes. Après avoir ouvert le Toolkit avec Reflector, il semble qu'il supporte le paradigme TargetName/NavigationUrl pour utiliser le lien hypertexte.

Si vous avez un scénario où vous auriez besoin de ce type de colonne à plusieurs endroits, je suggère d'étendre le DataGridHyperlinkColumn et d'ajouter une propriété Command. Vous pouvez ensuite modifier l'élément renvoyé par GenerateElement afin qu'il utilise votre commande.

+0

Abe: merci. J'espérais raccourcir autour DataGridTemplateColumn, mais, honnêtement, il ne semble pas bien pire que ce que j'avais. Merci encore! – dks1983

+0

Pouvez-vous expliquer comment fonctionnent les <? Ça a l'air très compliqué. – Dai

+0

@Dai - il s'agit d'une liaison 'RelativeSource' à une propriété' ICommand' sur le 'DataContext' de' ClientsSummaryView' où cette colonne est ajoutée. Cette question posée sur ces types de liaisons, et nous l'espérons, vous aidera à mieux le comprendre: http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource/84317#84317 –

Questions connexes