2017-06-04 65 views
0

我有一個DataGrid像這樣:WPF的DataGrid - retemplating細胞導致綁定不更新

<DataGrid ItemsSource="{Binding Persons}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Age}" CellStyle="{StaticResource EditableDataGridCellStyle}" /> 
    </DataGrid.Columns> 
</DataGrid> 

更改我的DataGridCells的風格與此代碼

<Style x:Key="EditableDataGridCellStyle" TargetType="DataGridCell"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="DataGridCell"> 
         <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

然而,當我編輯的TextBox的文本,DataGrid顯示新的值,但底層的Person對象不會更新他的年齡。當我擺脫「EditableDataGridCellStyle」並手動編輯DataGridCell(通過雙擊)時,它可以像我所期望的那樣工作。

如何確保編輯TextBox與編輯DataGrid單元格(即更新綁定)具有相同的效果?

回答

0

你應該綁定到Age財產和任何其他在你的模板,這個工作按預期:

<Style x:Key="EditableDataGridCellStyle" TargetType="DataGridCell"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="DataGridCell"> 
         <TextBox Text="{Binding Age}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

是的,這個遺憾,這意味着您需要定義不同Style爲每列。您最好使用DataGridTemplateColumnhttps://msdn.microsoft.com/en-us/library/system.windows.controls.datagridtemplatecolumn(v=vs.110).aspx

+0

這就是我所害怕的。我真的很想重新使用這種風格。 你知道任何「黑客」能夠指定從列的綁定?就像 或者我可以重用DataGridTemplateColumn? – samirem

+1

不可以。您能夠重用樣式的唯一方法是以編程方式定義它並以某種方式動態應用它。但這不值得付出努力。爲什麼你在這種情況下使用自定義模板? – mm8

+0

好的,謝謝。我使用自定義模板的目標是讓DataGrid的編輯行爲對我的最終用戶更直觀。但我走了另一條路線,並單擊單擊而不是雙擊單元格編輯觸發器。 – samirem