微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – WPF模板和GridView中的DataContext绑定

我正在尝试在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.

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

为什么模板不通过TemplateBinding到GridViewDataColumn将distributor作为其DataContext?

解决方法

以下是如何实现此目的的示例:

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

原文地址:https://www.jb51.cc/csharp/91549.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐