2012-01-25 13 views
6

自從切換到.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鍵,導致單元格值恢復並失去焦點,然後才能更正它們的輸入。

User must hit ESC in this situation to continue editing cells. Simply clicking away or changing the value back to something valid doesn’t work.

我仍然希望有一個更優雅的解決方案,將解決這個問題。


更新#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:CellEditorBindingUpdateSourceTrigger。但是,由於Xceed的許可證只包含6個月的錯誤修復更新,因此您必須支付全部新許可證費用(荒謬),而且我沒有看到任何公司授權使用可觀的1200美元單一開發人員許可證費用最新的Xceed dll只是爲了這個小錯誤,我仍然會努力在3.7版本的Xceed中找到一個完整的解決方法。我將向有能力獲取資金的開發者展示這個「解決方案」。

事實證明,升級到4.3並沒有解決問題。它似乎只是因爲我忘記退出我以前的改變。即使在最新版本中,Xceed仍未公開財產CellEditorBinding

+0

如果它被調用每個關鍵筆劃,那麼它聽起來像綁定正在使用'UpdateSourceTrigger = PropertyChanged'。嘗試將其添加到綁定中,並將其設置爲「LostFocus」,或者使用常規綁定替換「xcdg:CellEditorBinding」。 – Rachel

+0

沒有負責設置綁定的代碼。 datagrid處理綁定到源集合的列上的「FieldName」屬性的所有內容。我想建議如何更換xcdg:CellEditorBinding。我的印象是,xceed根本無法用其他方式工作。 – Alain

回答

3

解決的辦法是:

<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}" 
    Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell}, 
        Path=Content, UpdateSourceTrigger=LostFocus, 
        Converter={StaticResource EditablePercentageConverter}}" /> 

真的沒有其他辦法做到這一點。如果您沒有使用最新版本的Xceed,這也會導致驗證錯誤,但在最新版本中,使用這個新的綁定路徑完美運行。我仍然認爲這是一個破解,希望xceed會意識到它需要在其CellEditorBinding上公開更多的屬性。

0

我不知道XCeed控件,所以這只是教育猜測。

我個人將使該UpdateSourceTrigger到約束力的聲明就像是在常規.NET控件完成:

Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}, UpdateSourceTrigger=CellEndingEdit}" 

此外,由於控制是商業,你應有權從XCeed一些技術支持。

+1

這是一個合理的建議,但xcdg:CellEditorBinding沒有UpdateSourceTrigger屬性:[類成員](http://doc.xceedsoft.com/products/xceedwpfdatagrid/Xceed.Wpf.DataGrid.v4.2~ Xceed.Wpf.DataGrid.Markup.CellEditorBindingExtension_members.html)。 Xceed負責使用當前列的「FieldName」參數將綁定綁定到編輯器內容。 – Alain

相關問題