我希望我的datagrid列共享一个cell / celledit模板。
我有解决方案(感谢WPF DataGridTemplateColumn shared template?)。现在我喜欢通过避免所有节点嵌套来提高可读性。
我目前的观点如下:
<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">
<wpftk:DataGrid.Resources>
<DataTemplate x:Key="CustomCellTemplate">
<TextBlock Text="{TemplateBinding Content}"/>
</DataTemplate>
<DataTemplate x:Key="CustomCellEditingTemplate">
<TextBox Text="{TemplateBinding Content}"></TextBox>
</DataTemplate>
</wpftk:DataGrid.Resources>
<wpftk:DataGrid.Columns>
<wpftk:DataGridTemplateColumn Header="Start Date">
<wpftk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource CustomCellTemplate}" Content="{Binding StartDate}"/>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellTemplate>
<wpftk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource CustomCellEditingTemplate}" Content="{Binding StartDate}"/>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellEditingTemplate>
</wpftk:DataGridTemplateColumn>
<!--and again the whole block above for each columns...-->
</wpftk:DataGrid.Columns>
</wpftk:DataGrid>
我想要实现的是绑定DataGridTemplateColumn
级别的值并将其传播到模板级别。有谁知道怎么做?
我试图做的是这样的:
<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">
<wpftk:DataGrid.Resources>
<DataTemplate x:Key="CustomCellTemplate">
<TextBlock Text="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="CustomCellEditingTemplate">
<TextBox Text="{Binding}"></TextBox>
</DataTemplate>
</wpftk:DataGrid.Resources>
<wpftk:DataGrid.Columns>
<wpftk:DataGridTemplateColumn Header="Start Date" Binding="{Binding StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
<wpftk:DataGridTemplateColumn Header="End Date" Binding="{Binding EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
</wpftk:DataGrid.Columns>
</wpftk:DataGrid>
显然,绑定属性不是DataGridTemplateColumn
的有效属性,但可能通过使用datacontext并且一些相对来源可以做到这一点但坦率地说我无法找到实现它的方法。
不确定我想要的是否可能,我愿意接受“你决不能这样做”的答案
注意:模板中的TextBlock
/ TextBox
仅用于测试(真实模板要复杂得多)DataGridTextColumn
无法解决问题
提前致谢
答案 0 :(得分:1)
通过使用属性语法指定 XAML
来减少DataTemplates
,您尝试的内容应该有效。
编辑:抱歉。我误解了你的问题。要在不修改或访问源代码的情况下向DataGridTemplateColumn
添加可绑定属性,您可以创建AttachedProperty
。
示例:强>
public class DataBindingHelper
{
#region AttachedBinding
public static readonly DependencyProperty AttachedBindingProperty = DependencyProperty.RegisterAttached("AttachedBinding", typeof(Binding), typeof(DataBindingHelper), new FrameworkPropertyMetadata(null));
public static Binding GetUseAncestorDataContext(DependencyObject d)
{
return (bool)d.GetValue(AttachedBindingProperty);
}
public static void SetUseAncestorDataContext(DependencyObject d, Binding value)
{
d.SetValue(AttachedBindingProperty, value);
}
#endregion
}
<强>用法:强>
<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">
<wpftk:DataGrid.Resources>
<DataTemplate x:Key="NameTemplate">
<TextBlock Text="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="EditingTemplate">
<TextBox Text="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="CustomCellTemplate">
<ContentPresenter ContentTemplate="{StaticResource NameTemplate}"
Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />
</DataTemplate>
<DataTemplate x:Key="CustomCellEditingTemplate">
<ContentPresenter ContentTemplate="{StaticResource EditingTemplate}"
Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />
</DataTemplate>
</wpftk:DataGrid.Resources>
<wpftk:DataGrid.Columns>
<wpftk:DataGridTemplateColumn Header="Start Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
<wpftk:DataGridTemplateColumn Header="End Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
</wpftk:DataGrid.Columns>
</wpftk:DataGrid>
要了解有关附加属性的更多信息:请阅读MSDN documentation或任何WPF / C#书。它们是WPF中数据绑定系统最强大的功能之一。
另外,如果您想了解有关调试和迭代WPF应用程序的更多信息,请阅读我最近关于该主题的answer。 Snoop特别有助于您了解上述内容出了什么问题。