2010-11-23 127 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> 
相關問題