DataGrid和DataGridTemplateColumn

时间:2010-11-23 07:58:53

标签: wpf templates datagrid


我在我的应用程序中有几个DataGrid,它们每个都有相同的“模板”。例如,以下是每个DataGrid的定义方式:

<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
    <DataGridTemplateColumn CanUserResize="False"
        CanUserSort="False"
            CanUserReorder="False"
            CellStyle="{StaticResource RightCellStyle}">
...

如何在外部资源文件中将“DataGridTemplateColumn”定义为模板,因此我只需编写类似

的内容
<DataGridTemplateColumn Style={StaticResource MyFirstColumn}/>

在“MainGridStyle”中,我定义了“CanUserAddRows”等属性,......

请事先提供帮助。
佛瑞德

3 个答案:

答案 0 :(得分:4)

你在谈论4件不同的事情:

  • dataGrid的样式
  • DataGrid的模板
  • 你的第一栏的风格
  • 您的第一列模板

所以让我们先说清楚: 选择一个并坚持下去,尽量不要混合风格和模板(无论如何都可以包含另一个)

现在根据我的理解,你对第一列的模板比整个dataGrid更感兴趣。

应该很容易:

1)首先,在资源字典中声明列的模板(或样式)(最好是在应用程序的资源中):

<Application.Resources>
    <Template TargetType="DataGridTemplateColumn" x:Key="MyFirstColumnTemplate ">
    ...
    </Template>
</Application.Resources>

2)然后,只需按照您想要的方式调用它:

<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Template="{StaticResource MyFirstColumnTemplate}"/>
        ...
    </DataGrid.Columns>
<DataGrid>

修改

对于dataGridTemplateColumn,由于您只有CellTemplate和CellEditingTemplate属性可用,您可以执行以下操作:

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

免责声明:我不确定它是一个controlTemplate还是一个用于单元格(编辑)模板的数据模板,尝试两者并看看哪一个适合

答案 1 :(得分:1)

由于DataGridTemplateColumn没有Style属性,因此您可以做的一件事是创建附加属性。

以下是一个例子:

[注意:您可能需要更改以下代码以适合您的项目。]

具有附加属性的类 -

public class StyleExtensions
{
    public static Style GetStyle(DependencyObject obj)
    {
        return (Style)obj.GetValue(StyleProperty);
    }

    public static void SetStyle(DependencyObject obj, Style value)
    {
        obj.SetValue(StyleProperty, value);
    }

    public static void StyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Style style = e.NewValue as Style;
        if (style != null)
        {
            foreach (var s in style.Setters.OfType<Setter>())
            {
                d.SetValue(s.Property, s.Value);
            }
        }
    }

    // Using a DependencyProperty as the backing store for Style.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StyleProperty =
        DependencyProperty.RegisterAttached("Style", typeof(Style), typeof(StyleExtensions), new UIPropertyMetadata(StyleChanged));
}

Style -

的定义
    <Style x:Key="MyFirstColumn">
        <Setter Property="DataGridColumn.CanUserResize"
                Value="False" />
        <Setter Property="DataGridColumn.CanUserSort"
                Value="False" />
        <Setter Property="DataGridColumn.CanUserReorder"
                Value="False" />
        <Setter Property="DataGridColumn.CellStyle"
                Value="{StaticResource RightCellStyle}" />
    </Style>

使用 -

            <DataGrid>
                <DataGrid.Columns>
                    <DataGridTemplateColumn local:StyleExtensions.Style="{StaticResource MyFirstColumn}"></DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

答案 2 :(得分:0)

对于“外部”资源文件,您只需将其放在您在app.xaml文件中调用的资源字典中:

在“customTemplates.xaml”文件中:

<ResourceDictionary>
...
</ResourceDictionary>

然后在你的“app.xaml”文件中:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="customTemplates.xaml" />
            ...
            //add other resource dictionaries here if any
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>