2010-03-03 4 views
6

Я пытаюсь создать ряд связанных столбцов в RadGridView, и я использую шаблон для создания гиперссылок в двух столбцах. Вот в основном то, что у меня есть:WPF Шаблоны и привязка к DataContext в GridView

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

и

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

Сам RadGridView связан с набором объектов DistributorContainer, которые, помимо всего прочего, свойство Дистрибьюторов. Ссылка linkTemplate ссылается непосредственно на свойства объекта Distributor, поэтому для этого необходимо установить дистрибутив гиперссылки datacontext.

К сожалению, контекст данных гиперссылки является объектом DistributorContainer. Я использую linkTemplate (а также обработчик Hyperlink_Click) в списках, которые привязываются к спискам Distributors, и я действительно хотел бы повторно использовать этот шаблон, поскольку это в основном то же самое.

Почему шаблон не получает Дистрибьютора в качестве своего DataContext через TemplateBinding для GridViewDataColumn?

ответ

10

Вот пример того, как достичь этого:

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

Это делает работу и обеспечивает средства с использованием единого шаблона для любого GridView, но есть способ просто привязать к DataContext шаблонного родителя? Это придаст шаблону большую гибкость. – Jake

+0

Поскольку DataContext шаблона родителя (ячейки в этом случае) совпадает с DataContext строки, вы не можете достичь желаемого результата таким образом. –

Смежные вопросы