【问题标题】:WPF Templates and binding to DataContext in a GridViewWPF 模板和绑定到 GridView 中的 DataContext
【发布时间】:2011-01-23 00:00:25
【问题描述】:

我正在尝试在 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 直接引用 Distributor 对象中的属性,所以需要将超链接的 datacontext 设置为 Distributor。

不幸的是,超链接的数据上下文是 DistributorContainer 对象。我在绑定到分销商列表的列表上使用了 linkTemplate(以及 Hyperlink_Click 处理程序),我真的很想重新使用这个模板,因为它基本上是一样的。

为什么模板没有通过对 GridViewDataColumn 的 TemplateBinding 获取 Distributor 作为其 DataContext?

【问题讨论】:

    标签: c# wpf data-binding telerik datatemplate


    【解决方案1】:

    这是一个如何实现的示例:

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

    【讨论】:

    • 这确实有效,并提供了一种为任何 gridview 使用单个模板的方法,但是有没有办法只绑定到模板化父级的 DataContext?这会给模板带来更大的灵活性。
    • 由于模板化父项(在本例中为单元格)的 DataContext 与行的 DataContext 相同,因此您无法通过这种方式获得所需的结果。
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2012-11-05
    • 2013-02-02
    • 2021-07-19
    • 2016-04-20
    • 2010-11-01
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多