C# · 12月 23, 2021

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