Ton*_*ney 13 wpf resources datagridtemplatecolumn
在WPF数据网格中,我有一个定义为DataGridTemplateColumn的列,我需要在各种列上使用它.作为一个非常简单的例子,请将以下内容视为虚拟样本:
<DataGrid ItemsSource="{Binding Path=ItemList, Mode=OneWay}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" MinWidth="130" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<Image Source="component/Images/test.png"/>
<TextBlock Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
</DockPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<Image Source="component/Images/test.png"/>
<TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
</DockPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Company" Binding="{Binding Company, ValidatesOnDataErrors=True}" MinWidth="115" Width="Auto"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
举一个简单的例子,我如何将Header = Name的用于列的相同模板应用于Header = Company的列,而不必为每列重现整个模板?
我已经在之前的SO问题中找到了答案,他们用以下资源解释:
<Application.Resources>
<DataTemplate x:Key="CellTemplate">
...
</DataTemplate>
<DataTemplate x:Key="CellEdintingTemplate">
...
</DataTemplate>
</Application.Resources>
<DataGrid Style="{StaticResource MainGridStyle}">
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/>
...
</DataGrid.Columns>
<DataGrid>
Run Code Online (Sandbox Code Playgroud)
这让我95%,但我遗失的最后一块是如何处理数据绑定?如何在模板中创建某种类型的占位符,然后在网格中进行实际绑定?
编辑 我一直在寻找并发现问题Create Common DataGridTemplateColumn听起来像我想要做的事实上当前可能是不可能的.因此,如果其他任何人都试图这样做,并看到这个问题我不能保证这是不可能的,但从这个链接似乎可能是.因此,只需复制每列的所有tempalte代码.
您可以将CellStyle属性设置为覆盖Templatefor的样式DataGridCell.
在Template,使用一个ContentPresenter绑定到TemplatedParent.Content你想要放置DataGridCell的内容的地方,因为它TemplatedParent是DataGridCell
例如,
<Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Image Source="component/Images/test.png"/>
<ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataGrid ItemsSource="{Binding ItemList}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" CellStyle="{StaticResource MyCellStyle}" MinWidth="130" Width="Auto" />
<DataGridTextColumn Header="Company" Binding="{Binding Company}" CellStyle="{StaticResource MyCellStyle}" MinWidth="115" Width="Auto"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
链接Create Common DataGridTemplateColumn 中有一个解决方案。
Poptart911 制作了一个 DatagridBoundTemplateColumn,可用于替换 DataGridTemplateColumn,允许您在列上设置“绑定”属性。因此,您可以重用 DataTemplate 并将不同的 DataContext 分配给不同列的模板。
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace OwensWpfFunStuff
{
public class DataGridBoundTemplateColumn : DataGridBoundColumn
{
public DataTemplate CellTemplate { get; set; }
public DataTemplate CellEditingTemplate { get; set; }
protected override System.Windows.FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
return Generate(dataItem, CellEditingTemplate);
}
private FrameworkElement Generate(object dataItem, DataTemplate template)
{
var contentControl = new ContentControl { ContentTemplate = template, Content = dataItem };
BindingOperations.SetBinding(contentControl, ContentControl.ContentProperty, Binding);
return contentControl;
}
protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
return Generate(dataItem, CellTemplate);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10553 次 |
| 最近记录: |