2010-04-16 3 views
6

Gibt es eine Möglichkeit, einen Befehl mit einer DataGridHyperlinkColumn zuzuordnen? Ich habe dies versucht:Gibt es eine Möglichkeit, einen Befehl mit einem WPF-Toolkit DataGridHyperlinkColumn zu verknüpfen?

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

Zur Laufzeit kann ich sehen, dass die Bindung korrekt ausgewertet wird (die Eigenschaft Getter für den Befehl genannt wird), aber der Befehl wird nicht ausgeführt, wenn ich den Hyper-Link klicken. Gibt es einen besseren Weg, dies zu tun?

Danke,

Daniel

Antwort

10

Sind Sie sicher, dass der Befehl mit dem Hyperlink zugeordnet wird? Ich habe versucht, dies in einer Beispielanwendung einzurichten, und der Befehl wurde nicht mit dem Hyperlink verknüpft (wenn Sie false von CanExecute zurückgeben, können Sie schnell feststellen, ob die Verbindung aufgebaut ist).

Stattdessen habe ich ein DataGridTemplateColumn dies zu erreichen:

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

Dies würde bekommen wirklich ärgerlich, wenn man mehrere Spalten zu schaffen hat. Nachdem das Toolkit mit Reflector geöffnet wurde, sieht es so aus, als ob es das TargetName/NavigationUrl Paradigma für die Verwendung des Hyperlinks unterstützt.

Wenn Sie ein Szenario haben, in dem Sie diese Art von Spalte an vielen Stellen benötigen, würde ich vorschlagen, die DataGridHyperlinkColumn zu erweitern und eine Command-Eigenschaft hinzuzufügen. Sie könnten dann das von GenerateElement zurückgegebene Element so ändern, dass es Ihren Befehl verwendet.

+0

Abe: Danke. Ich hatte gehofft, um DataGridTemplateColumn zu verkürzen, aber, ehrlich gesagt, sieht es nicht viel schlechter aus als das, was ich hatte. Danke noch einmal! – dks1983

+0

Können Sie erklären, wie der '' funktioniert? Es sieht sehr kompliziert aus. – Dai

+0

@Dai - dies ist eine 'RelativeSource'-Bindung an eine' ICommand'-Eigenschaft im 'DataContext' von' ClientsSummaryView', wo diese Spalte hinzugefügt wird. Diese Frage wurde nach diesen Bindungstypen gestellt und wird Ihnen hoffentlich helfen, sie besser zu verstehen: http://stackoverflow.com/questions/84278/how-doi-i-use-wpf-bindings-with-relativesources/84317#84317 –

Verwandte Themen