Шаблоны WPF и привязка к DataContext в GridView - PullRequest
6 голосов
/ 03 марта 2010

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

<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, которые, помимо прочего, имеют свойство Distributor. LinkTemplate напрямую ссылается на свойства в объекте распространителя, поэтому для текстового гиперссылки необходимо установить значение распространителя.

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

Почему шаблон не получает Distributor в качестве своего DataContext через TemplateBinding к GridViewDataColumn?

1 Ответ

10 голосов
/ 04 марта 2010

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

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; }
    }
}
...