2010-03-03 11 views
6

Ich versuche, eine Reihe von gebundenen Spalten in einem RadGridView zu erstellen, und ich verwende eine Vorlage, um Hyperlinks in zwei der Spalten zu erstellen. Hier ist im Grunde, was ich habe:WPF-Vorlagen und Bindung an DataContext in einer GridView

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

und

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

Die RadGridView selbst ist verpflichtet, auf eine Reihe von Objekten, die DistributorContainer haben, unter anderem ein Distributor Eigentum. Das linkTemplate verweist direkt auf Eigenschaften im Distributor-Objekt, sodass der Datenkontext des Hyperlinks auf den Verteiler festgelegt werden muss.

Leider ist der Datenkontext des Hyperlinks das DistributorContainer-Objekt. Ich verwende das linkTemplate (sowie den Hyperlink_Click-Handler) für Listen, die an Listen von Distributoren binden, und ich würde diese Vorlage gerne wiederverwenden, da es im Grunde dasselbe ist.

Warum erhält die Vorlage, die den Verteiler als seinen DataContext durch das TemplateBinding in der GridViewDataColumn erhält, nicht? Hier

Antwort

10

ist ein Beispiel dafür, wie dies zu erreichen:

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

funktionierts und stellt ein Mittel eine einzige Vorlage für die Gridview zu verwenden, sondern ist gibt es eine Möglichkeit, nur an den DataContext des Vorlagenstamms zu binden? Dies würde der Vorlage viel mehr Flexibilität geben. – Jake

+0

Da DataContext des übergeordneten Templates (Zelle in diesem Fall) dem DataContext der Zeile entspricht, können Sie auf diese Weise kein gewünschtes Ergebnis erzielen. –

Verwandte Themen