自從切換到.NET 4.0後,數據錄入出現問題。 在我的Xceed 3.7網格中,用戶曾經能夠在單元格中鍵入一個值,當他們點擊或敲入回車時,將調用綁定轉換器的ConvertBack
方法,解析用戶輸入值並以所需格式存儲。轉換器在每個按鍵上都被調用,而不是在用戶輸入結束時調用
現在所有的突然,這是發生的每一次擊鍵 - 這是造成一個巨大的問題,因爲如果用戶刪除一個號碼並開始鍵入一個又一個,(可以說-100),只要他們輸入負號,convertback觸發並拋出異常,因爲「 - 」不是可解析的字符串,並且值被還原。
我認爲問題很明顯,所以現在我會粘貼一些代碼。
列用戶輸入如下所示:
<xcdg:DataGridControl x:Name="AggCatGrid01"
ItemsSource="{Binding Source={StaticResource myDataSource}}" >
<xcdg:DataGridControl.Columns>
...
<xcdg:Column VisiblePosition="0" FieldName="SomeValue" Title="Some Value"
CellEditor="{StaticResource PercentageEditor}"
CellContentTemplate="{StaticResource EditablePercent2CellContentTemplate}" />
DataGrid中都有着相同的風格:
<Style x:Key="{x:Type xcdg:DataGridControl}" TargetType="{x:Type xcdg:DataGridControl}">
<Setter Property="UpdateSourceTrigger" Value="CellEndingEdit"/>
<Setter Property="AutoCreateColumns" Value="False"/>
<Setter Property="EditTriggers" Value="BeginEditCommand, CellIsCurrent, ActivationGesture"/>
<Setter Property="CellEditorDisplayConditions" Value="CellIsCurrent"/>
<Setter Property="NavigationBehavior" Value="CellOnly"/>
注意UpdateSourceTrigger
設置爲CellEndingEdit
。我會認爲這裏的這個權利將負責轉換器被調用並且更新綁定值。不管通過切換.NET4而改變的控件。
下面是該列的數據模板,你看到上面使用:
<!-- Styles used when editable cells are being edited. -->
<xcdg:CellEditor x:Key="PercentageEditor">
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}}" />
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
我想轉換器代碼本身是無關的,所以我會離開它,除非它的要求。問題在於每次擊鍵都會被調用。
如果你能解釋這一點,我會欣喜若狂。我的意思是,我可能必須回滾所有的.NET 4.0增強功能,或者延遲我的下一個版本一個月以上,將所有數據網格重寫爲不再使用xceed,如果沒有解決方案。多謝你們。
更新#1
其實我有一個適度聰明的解決方法(在我微薄的意見),我介紹了一個虛擬的文本塊,以保持CellEditorBinding xceed迫使我們在DataTemplate中使用了上來。然後,我將輸入控件更改爲直接綁定到textblock的文本屬性而不是CellEditorBinding,這使我可以指定自己的綁定模式。在這裏,我可以將模式設置爲「lostFocus」,主要問題已解決!轉換器不再在每次擊鍵時被調用,而只在用戶離開單元格或命中時才進入。
<xcdg:CellEditor x:Key="PercentageEditor">
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<Grid>
<TextBlock x:Name="bind_source" Text="{xcdg:CellEditorBinding}" Visibility="Collapsed"/>
<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
Text="{Binding ElementName=bind_source, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource EditablePercentageConverter}}" />
</Grid>
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
正如你可以想象的那樣,這層間接引發了一些其他小問題,比如破壞驗證。奇怪的是,現在當用戶鍵入無效數據時,轉換器會拋出一個異常,xceed捕獲並使用該異常打開單元格的錯誤模板,但糾正錯誤並按下回車鍵不再有效。用戶唯一的選擇是按Esc鍵,導致單元格值恢復並失去焦點,然後才能更正它們的輸入。
我仍然希望有一個更優雅的解決方案,將解決這個問題。
更新#2
我發現Xceed支持論壇其中提出相同的問題我在這個崗位開發者:http://silverlightdatagrid.com/CS/forums/permalink/31548/31516/ShowThread.aspx#31516。 CellEditorBinding只似乎支持的PropertyChanged驗證:
許多用戶似乎完全由你的例子(這在很大程度上是過時的.NET 4.0),並只針對使用的xcdg自己的控件混淆。
不幸的是沒有提供任何解決方案。他確實提出了一種更優雅的更新源觸發器的策略,但我仍然遇到驗證錯誤會凍結單元格直到用戶點擊ESC的問題。
<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell},
Path=Content, UpdateSourceTrigger=LostFocus,
Converter={StaticResource EditablePercentageConverter}}" />
更新#3
我已經證實,通過更新到Xceed DataGrid的版本4.3(試行),問題走了所有關於自己的,因爲在該版本中, Xceed更新了其與.Net4.0不兼容的xcdg:CellEditorBinding
UpdateSourceTrigger
。但是,由於Xceed的許可證只包含6個月的錯誤修復更新,因此您必須支付全部新許可證費用(荒謬),而且我沒有看到任何公司授權使用可觀的1200美元單一開發人員許可證費用最新的Xceed dll只是爲了這個小錯誤,我仍然會努力在3.7版本的Xceed中找到一個完整的解決方法。我將向有能力獲取資金的開發者展示這個「解決方案」。
事實證明,升級到4.3並沒有解決問題。它似乎只是因爲我忘記退出我以前的改變。即使在最新版本中,Xceed仍未公開財產CellEditorBinding
。
如果它被調用每個關鍵筆劃,那麼它聽起來像綁定正在使用'UpdateSourceTrigger = PropertyChanged'。嘗試將其添加到綁定中,並將其設置爲「LostFocus」,或者使用常規綁定替換「xcdg:CellEditorBinding」。 – Rachel
沒有負責設置綁定的代碼。 datagrid處理綁定到源集合的列上的「FieldName」屬性的所有內容。我想建議如何更換xcdg:CellEditorBinding。我的印象是,xceed根本無法用其他方式工作。 – Alain