2009-08-10 76 views
2

我在使用CellTemplate/CellEditingTemplate時數據綁定對象的屬性沒有更新的DataGrid遇到問題:Silverlight:使用CellEditingTemplate時出現問題

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

我通過RIA服務綁定到代碼生成的實體。我已經爲PropertyChanged事件添加了一個事件處理程序,它永遠不會被觸發。但是,如果我不使用模板而是使用DataGridTextColumn,一切正常。

我確定這聽起來像一個簡單的修復 - 我只在我的編輯模板中使用TextBox,那麼爲什麼我們不使用DataGridTextColumn?問題是我想要一個多行文本框,所以使用DataGridTextColumn不是一個選項。

有什麼建議嗎?您是否知道使用包含單個TextBox的CellEditingTemplate和使用DataGridTextColumn之間的任何差異?

謝謝,
-Charles

[更新]
我在這裏發佈了一個錯誤報告:
http://silverlight.net/forums/p/118729/267521.aspx

我無法想象這是「按照設計」。 ..如果其他人已經知道這件事並且我只是愚蠢,我會感激一個解釋 - 我更喜歡尷尬而不是無知:)。

+0

+1:我一直有同樣的問題。 – 2009-08-10 19:37:10

+0

如果您找到解決方案,請讓我知道。這開始讓我瘋狂。如果我找到解決方案,我會確保更新。 – Charles 2009-08-10 19:46:15

+0

好吧,我找到了一個解決方案...... – Charles 2009-08-10 22:03:24

回答

0

我找到了解決辦法,但我無法解釋爲什麼它的確與衆不同:

改變了...

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

...這樣的:

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 


請注意我如何在TextBlock的綁定上指定「Mode = OneWay」:

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 


我不知道爲什麼這應該有所作爲。即使TextBlock設置爲TwoWay,爲什麼不會對數據綁定對象進行任何更改?

一個解釋將不勝感激......我花了大約五個小時對我的鍵盤猛撞我的頭只是爲了達到這一點,我想知道爲什麼這是我犯了這個錯誤(假設它不是Silverlight中的錯誤)。

感謝,
- 查爾斯

+0

根據您所看到的行爲來判斷,我會說XML節點按順序處理,並且ctor簽名被確定一次並緩存。 – 2010-07-17 07:47:47

0

我「嫌疑」問題出在文本框的Text屬性的默認構造函數。

現在的Text屬性是dependecyproperty,當你調用

<TextBlock Text="{Binding Text}" ></TextBlock> 

你實際要求,需要一個單一的字符串值,進而SL的Text屬性的構造函數/ WPF使用反射來找出哪些構造是的,你可以通過在命名參數樣式中使用它來避免這種情況。

<TextBlock Text="{Binding Path=Text}" ></TextBlock> 

我認爲沒有說明它實際上默認爲一次性綁定的模式,這就是爲什麼OnPropertyChanged犯規影響值,因爲結合只會發生一次。這看起來像下面。現在,文本框綁定的默認值是「OneWay」,也許因爲它嵌套在數據網格中,其默認行爲是不同的。也許它做屬性繼承的東西,並使用UI控件的綁定模式。

<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock> 

所以爲什麼當你指定喜歡的結合模式,

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 

它的工作原理,並愉快地容易

相關問題