2011-04-19 302 views
17

是否可以在風格或資源中聲明DataGrid列? 我願做這樣的事情:WPF DataGrid風格或資源中的列

<....Resources> 
    <DataGridColumns x:Key="dgcDataGridColumns"> 
     <DataGridTextColumn /> 
     <DataGridTextColumn /> 
    </DataGridColumns 
</....Resources> 

<DataGrid Columns="{StaticResource dgcDataGridColumns}" /> 

的原因是,我給大家分享列定義爲4個不同的DataGrids。任何方式來實現這一目標?最好的是沒有代碼背後!

+1

我想這取決於Datagrid的供應商...我知道,Xceed數據網格允許資源定義列,但我不知道其他人。你在使用哪一個? WPF工具包一個? – Bruno 2011-04-19 12:45:23

+0

我正在使用.NET 4 WPF DataGrid – SACO 2011-04-20 07:31:25

回答

20

DataGrid的Columns屬性有沒有setter所以它是不可能。你可以做這樣的事情:

<Window.Resources> 

    <Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False"> 
     <Controls:DataGrid.Columns> 
      <Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/> 
      <Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/> 
     </Controls:DataGrid.Columns> 
    </Controls:DataGrid> 

</Window.Resources> 

<StackPanel> 
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}"></ContentControl> 
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}"></ContentControl> 
</StackPanel> 
+0

好吧,這似乎是伎倆。但是,我如何將一個樣式應用於內容控件的內容(實際上到DataGrid)? – SACO 2011-04-20 07:42:45

+0

請發表新評論,難以回答。 – 2011-04-20 13:17:40

+0

http://stackoverflow.com/questions/5731276/wpf-contentcontrol-styling – SACO 2011-04-20 13:40:54

4

我不認爲你可以,因爲在那種情況下,你沒有指定模板或樣式,而是實際的Column對象。當我這樣分享數據時,我認爲數據網格不會很好地發揮作用;我認爲你會得到一個例外,「這個UIElement已經是另一個UIElement的孩子」。

所以我嘗試了以下......與你所說的略有不同。但我得到這個異常:

{「的DataGridColumn與頭‘’已存在在DataGrid的列集合的DataGrid無法共享列,不能包含重複的列實例\ r \ n參數名:項目」}

與此XAML:

  <Grid.Resources> 
      <DataGridTextColumn x:Key="MyColumn" /> 
     </Grid.Resources> 
      <DataGrid> 
      <DataGrid.Columns> 
       <StaticResource ResourceKey="MyColumn" /> 
      </DataGrid.Columns> 
     </DataGrid> 

     <DataGrid> 
      <DataGrid.Columns> 
       <StaticResource ResourceKey="MyColumn" /> 
      </DataGrid.Columns> 
     </DataGrid> 
+1

感謝您發表本文,即使它沒有回答這個問題。包含例外文本幫助我找到了我需要的答案(x:Shared =「False」)。 – Malachi 2012-11-19 22:33:28

24

x:共享有助於避免例外MattS423了。

<Window.Resources> 
    <DataGridTextColumn x:Key="dgtcFirstName" x:Shared="False" Header="First Name" Binding="{Binding FirstName}"/> 
    <DataGridTextColumn x:Key="dgtcSecondName" x:Shared="False" Header="Second Name" Binding="{Binding SecondName}"/> 
</Window.Resources> 

<Grid> 
    <StackPanel> 
     <DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="200"> 
      <DataGrid.Columns> 
       <StaticResource ResourceKey="dgtcFirstName"/> 
       <StaticResource ResourceKey="dgtcSecondName"/> 
      </DataGrid.Columns> 
     </DataGrid> 
     <DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid2" Width="200"> 
      <DataGrid.Columns> 
       <StaticResource ResourceKey="dgtcSecondName"/> 
       <StaticResource ResourceKey="dgtcFirstName"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </StackPanel> 
</Grid> 

+1

這是一個很好的解決方案,以避免複製和粘貼相同的列定義反覆。我發現奇怪的是x:Shared雖然沒有出現在intellisense中,但是效果都很好 – wangburger 2011-07-21 14:56:07

+0

從來沒有新的關於資源共享......爲我解決了多個問題,包括爲多個數據網格重複使用datagrid列,非常感謝 – TCC 2014-01-17 22:05:38