2013-11-21 40 views
0

我有一個WPF DataGrid有一些單元格(不是列),需要基於viewmodel中的某些值從只讀切換到可編輯。我能找到這樣做(在一番搜索)的唯一方法是這樣的:使模板通用

<UserControl.Resources> 
    <DataTemplate x:Key="CellTemplate"> 
     <TextBlock 
      Text="{Binding MyValue}" 
      Style="{StaticResource CellTextBlockNumber}" /> 
    </DataTemplate> 

    <DataTemplate x:Key="ReadonlyCellTemplate"> 
     <TextBlock 
      Text="{Binding MyValue}" 
      Style="{StaticResource CellTextBlockNumberReadonly}" /> 
    </DataTemplate> 

    <DataTemplate x:Key="EditableCellTemplate"> 
     <TextBox 
      Text="{Binding MyValue}" 
      Style="{StaticResource CellTextBoxNumber}" 
      FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" /> 
    </DataTemplate> 
</UserControl.Resources> 

各種風格的只是不喜歡的東西設置的背景顏色等

然後在DataGrid.Columns部分:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource CellTemplate}" /> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding EnableCells}" Value="False"> 
        <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource ReadonlyCellTemplate}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 

    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource EditableCellTemplate}" /> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding EnableCells}" Value="False"> 
        <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource ReadonlyCellTemplate}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

所以基本上ContentPresenter的ContentTemplate是基於DataTrigger換出的。

這對單列很好,但我有大約10列需要此功能(在單元級別),而且我真的不想爲每列創建3個模板(如果不需要)。有沒有一種方法可以修改它,以便模板綁定到可以在DataGridColumn級別指定的「通用」值(而不是MyValue)?

回答

1

使用您已擁有的模板,只有在文本塊中更改的文本應爲Text="{Binding }"

然後在內容控制(在單元/編輯模板),有內容的約束是這樣的:

Content="{Binding MyValue}" 

所以,現在你將有隻有三個模板,並在每個列中,您可以指定不同的結合用於內容控制的內容。

+0

這似乎很接近。它適用於CellTemplate,但是當我雙擊編輯時,我得到一個xaml異常:「雙向綁定需要路徑或XPath」 – ConditionRacer

+0

在文本框的文本屬性綁定中添加'Path = .'。 – XAMeLi

+0

謝謝,任何想法爲什麼我不能使用CTRL-C使用此方法複製textblock中的值? – ConditionRacer