2010-11-23 92 views
1


我在我的应用程序中有几个DataGrid,它们都有相同的“模板”。例如,这里的每一个DataGrid中是如何定义的:DataGrid和DataGridTemplateColumn

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

我怎么能定义“DataGridTemplateColumn”作为一个外部资源文件的模板,所以我也只会写类似

<DataGridTemplateColumn Style={StaticResource MyFirstColumn}/> 

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

Thx提前为您提供帮助。
弗雷德

回答

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

你在这里谈论的4个不同的事情:

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

免责声明:我不知道,如果它是一个控件模板或为一个DataTemplate细胞(编辑)模板,都试一下,看看至极一个适合

+0

嗯,这听起来很琐碎。如果我想在外部资源文件/字典中声明这个“模板”?顺便说一下,我的VisualStudio抱怨DataGridTemplateColumn中没有Template属性! – Fred 2010-11-23 08:55:06

0

对于“外部”的资源文件,你可以简单地把它放在你在你打电话App.xaml文件资源字典:

在“customTemplates.xaml”文件:

<ResourceDictionary> 
... 
</ResourceDictionary> 

然后在你的“应用程序。XAML”文件:

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