2010-03-03 9 views
6

Estoy tratando de crear una serie de columnas encuadernadas en un RadGridView, y estoy usando una plantilla para crear hipervínculos en dos de las columnas. Aquí es básicamente lo que tengo:Plantillas WPF y enlace a DataContext en un GridView

<telerik:GridViewDataColumn IsReadOnly="True" UniqueName="Distributor" DataContext="{Binding Distributor}" CellTemplate="{StaticResource linkTemplate}"/> 

y,

<DataTemplate x:Key="linkTemplate"> 
     <TextBlock> 
      <Hyperlink DataContext={TemplateBinding DataContext} Click="Hyperlink_Click"> 
       <TextBlock Text="{Binding Name}" /> 
      </Hyperlink> 
     </TextBlock> 
    </DataTemplate> 

El RadGridView sí está unido a un conjunto de objetos DistributorContainer que tienen, entre otras cosas, una propiedad del Distribuidor. El linkTemplate se refiere directamente a las propiedades en el objeto Distribuidor, por lo que el contexto de datos del hipervínculo debe establecerse en el Distribuidor.

Desafortunadamente, el contexto de datos del hipervínculo es el objeto DistributorContainer. Estoy usando linkTemplate (así como el manejador Hyperlink_Click) en las listas que se unen a las listas de Distribuidores, y realmente me gustaría volver a usar esta plantilla ya que básicamente es lo mismo.

¿Por qué la plantilla no obtiene al distribuidor como su DataContext a través de TemplateBinding a GridViewDataColumn?

Respuesta

10

Aquí es un ejemplo la forma de lograr esto:

XAML

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="linkTemplate"> 
      <TextBlock> 
       <Hyperlink> 
        <TextBlock 
         Text="{Binding 
          Value.Name, 
           RelativeSource={RelativeSource FindAncestor, 
           AncestorType={x:Type telerik:GridViewCell}}}" /> 
       </Hyperlink> 
      </TextBlock> 
     </DataTemplate> 
    </Grid.Resources> 
    <telerik:RadGridView ItemsSource="{Binding}" AutoGenerateColumns="False"> 
     <telerik:RadGridView.Columns> 
      <telerik:GridViewDataColumn 
       DataMemberBinding="{Binding Distributor1}" 
       CellTemplate="{StaticResource linkTemplate}" /> 
      <telerik:GridViewDataColumn 
       DataMemberBinding="{Binding Distributor2}" 
       CellTemplate="{StaticResource linkTemplate}" /> 
     </telerik:RadGridView.Columns> 
    </telerik:RadGridView> 
</Grid> 

C#

namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = 
       from i in Enumerable.Range(0, 10) 
       select new DistributorContainer() 
       { 
        ID = i, 
        Distributor1 = new Distributor() { 
         Name = String.Format("Distributor1 Name{0}", i) }, 
        Distributor2 = new Distributor() { 
         Name = String.Format("Distributor2 Name{0}", i) } 
       }; 
     } 
    } 

    public class DistributorContainer 
    { 
     public int ID { get; set; } 
     public Distributor Distributor1 { get; set; } 
     public Distributor Distributor2 { get; set; } 
    } 

    public class Distributor 
    { 
     public string Name { get; set; } 
    } 
} 
+0

Esto funciona y proporciona un medio de utilizar un único modelo para cualquier gridview, pero es Hay una forma de vincular solo al DataContext del padre con plantilla? Esto daría a la plantilla mucha más flexibilidad. – Jake

+0

Dado que el DataContext del padre con plantilla (celda en este caso) es el mismo que DataContext de la fila, no puede lograr el resultado deseado de esta manera. –

Cuestiones relacionadas