首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid和DataGridTemplateColumn

DataGrid和DataGridTemplateColumn
EN

Stack Overflow用户
提问于 2010-11-23 15:58:53
回答 3查看 3.8K关注 0票数 1

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

代码语言:javascript
复制
<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
    <DataGridTemplateColumn CanUserResize="False"
        CanUserSort="False"
            CanUserReorder="False"
            CellStyle="{StaticResource RightCellStyle}">
...

我如何在外部资源文件中将"DataGridTemplateColumn“定义为模板,这样我就只需编写如下内容

代码语言:javascript
复制
<DataGridTemplateColumn Style={StaticResource MyFirstColumn}/>

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

提前感谢您的帮助。

弗雷德

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-23 17:15:43

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

下面是一个示例:

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

使用附加的属性初始化-

代码语言:javascript
复制
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的定义-

代码语言:javascript
复制
    <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>

使用-

代码语言:javascript
复制
            <DataGrid>
                <DataGrid.Columns>
                    <DataGridTemplateColumn local:StyleExtensions.Style="{StaticResource MyFirstColumn}"></DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
票数 1
EN

Stack Overflow用户

发布于 2010-11-23 16:21:18

你在这里谈论的是4个不同的东西:

  • the dataGrid's
  • the DataGrid's
  • your first column's style
  • your first column's template

因此,让我们首先得到精确的:选择一个并坚持它,尽量不要混淆样式和模板(一个可以包含另一个)

现在,据我所知,您更感兴趣的是为第一个专栏创建一个模板,而不是为整个dataGrid创建一个模板。

这应该很简单:

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

代码语言:javascript
复制
<Application.Resources>
    <Template TargetType="DataGridTemplateColumn" x:Key="MyFirstColumnTemplate ">
    ...
    </Template>
</Application.Resources>

2)然后,就像你想做的那样简单地调用它:

代码语言:javascript
复制
<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Template="{StaticResource MyFirstColumnTemplate}"/>
        ...
    </DataGrid.Columns>
<DataGrid>

编辑:

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

代码语言:javascript
复制
<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还是dataTemplate,两个都试一下,看看哪一个合适

票数 4
EN

Stack Overflow用户

发布于 2010-11-23 17:04:33

对于“外部”资源文件,您可以简单地将其放入在app.xaml文件中调用的资源字典中:

在"customTemplates.xaml“文件中:

代码语言:javascript
复制
<ResourceDictionary>
...
</ResourceDictionary>

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

代码语言:javascript
复制
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="customTemplates.xaml" />
            ...
            //add other resource dictionaries here if any
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4253875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档