2010-09-10 131 views
0

我創建了一個綁定到可觀察集合的列的數據網格。除了從我的業務對象綁定到一個可爲空的小數屬性的列之外,所有的工作都很好。Wpf 4 DataGrid列綁定問題

如果我使用

<DataGridTextColumn Binding="{Binding Path=BaseUnitCostValue}" Header="Unit Cost Value" MinWidth="100" /> 

我的列定義一切運作良好,但是,我最終還是會希望它是一個複雜的專欄中,我使用DatagridTemplateColumn試過這樣

<DataGridTemplateColumn Header="Unit Cost Value" MinWidth="100"> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

然而,使用這個列配置,雖然我可以在完成對單元格的編輯後立即輸入一個值,但它的值會消失。

我也嘗試使用轉換器轉換爲字符串,並再次返回到可爲空的小數,但沒有運氣。

我強烈懷疑這是事實,它是綁定到一個可爲空的小數。是否還有更多我需要做我的cellTemplates,這樣的值綁定正確,以同樣的方式是使用標準的DataGridTextColumn?

感謝

+0

你在代碼後面綁定DataGrid嗎?如果是,有哪些來源? – Neutralizer 2010-09-10 12:21:19

回答

1

也許是因爲你試圖讓在非編輯模板TextBlock的雙向結合:

<DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 

嘗試將其更改爲單向的,可以將其那麼工作。也刪除觸發器語句。

如果沒有幫助,請查看輸出窗口,看看是否有相關信息。

+0

不幸的是,從textblock中移除mode = TwoWay和UpdateSourceTrigger = PropertyChanged並沒有什麼區別 – user360349 2010-09-10 12:28:46

+0

並且在輸出窗口中沒有相關消息? – HCL 2010-09-10 12:30:59

+0

a)嘗試如果將TextBox聲明爲默認模板並且未聲明編輯模板會發生什麼情況。 b)創建並附加一個不返回輸入值的值轉換器。在轉換器中設置斷點以查看發生了什麼。 – HCL 2010-09-10 12:40:45

0

這是我的商業模式中的問題。

我有我的財產

Public Property BaseUnitCostValue As Decimal? 
     Get 
      Return _BaseUnitCostValue 
     End Get 
     Set(ByVal value As Decimal?) 
      If _BaseUnitCostValue <> value Then 
       _BaseUnitCostValue = value 
       Me.DataStateChanged("BaseUnitCostValue") 
       Me.DataStateChanged("TotalBaseUnitCostValue") 
      End If 

     End Set 
    End Property 

改爲

Public Property BaseUnitCostValue As Decimal? 
     Get 
      Return _BaseUnitCostValue 
     End Get 
     Set(ByVal value As Decimal?) 
      If (Not _BaseUnitCostValue.HasValue) OrElse (Not value.HasValue) OrElse _BaseUnitCostValue <> value Then 
       _BaseUnitCostValue = value 
       Me.DataStateChanged("BaseUnitCostValue") 
       Me.DataStateChanged("TotalBaseUnitCostValue") 
      End If 

     End Set 
    End Property 

和問題走了。感謝HCL,因爲在一個簡單的轉換器中斷點的想法告訴我,該屬性從未實際更新。