2010-04-16 7 views
6

¿Hay alguna manera de asociar un comando con un DataGridHyperlinkColumn? He intentado esto:¿Hay alguna forma de asociar un comando con un WPF Toolkit 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> 

En tiempo de ejecución, puedo ver que está siendo evaluado correctamente (la propiedad de captador para el comando se llama) la unión, pero el comando no se ejecuta al hacer clic en el hipervínculo. ¿Hay una mejor manera de hacer esto?

Gracias,

Daniel

Respuesta

10

¿Estás seguro de que el comando se asocia con el hipervínculo? Intenté configurar esto en una aplicación de muestra, y el comando no estaba asociado con el hipervínculo (si devuelve falso desde CanExecute, podrá determinar rápidamente si está conectado).

En cambio, he creado un DataGridTemplateColumn de lograr esto:

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

Esto conseguir realmente molesto si tuviera que crear varias columnas. Después de abrir el Toolkit con Reflector, parece que admite el paradigma TargetName/NavigationUrl para usar el hipervínculo.

Si tiene un escenario en el que necesita este tipo de columna en muchos lugares, le sugiero que extienda el DataGridHyperlinkColumn y agregue una propiedad de comando. Luego puede modificar el elemento devuelto desde GenerateElement para que use su comando.

+0

Abe: gracias. Esperaba un atajo alrededor de DataGridTemplateColumn, pero, sinceramente, no se ve mucho peor de lo que tenía. ¡Gracias de nuevo! – dks1983

+0

¿Puedes explicar cómo funciona '' '? Se ve muy complicado. – Dai

+0

@Dai - este es un enlace 'RelativeSource' a una propiedad' ICommand' en 'DataContext' de' ClientsSummaryView' donde se agrega esta columna. Esta pregunta le preguntó acerca de estos tipos de enlaces, y con suerte lo ayudará a comprenderlo mejor: http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource/84317#84317 –

Cuestiones relacionadas