2012-01-25 3 views
6

Tôi gặp sự cố với nhập dữ liệu từ khi chuyển sang .NET 4.0. Trong mạng Xceed 3.7 của tôi, người dùng sử dụng để có thể nhập giá trị vào ô và khi họ nhấp hoặc nhấn enter, phương thức ConvertBack của trình biến đổi sẽ được gọi, phân tích giá trị nhập của người dùng và lưu trữ ở định dạng mong muốn .Trình chuyển đổi đang được gọi trên mọi lần nhấn phím thay vì ở đầu người dùng cuối

Bây giờ đột nhiên, đây là xảy ra mỗi lần gõ phím - điều này gây ra vấn đề lớn, bởi vì nếu người dùng xóa số và bắt đầu nhập số khác, (cho phép nói -100), ngay khi họ nhập các dấu hiệu tiêu cực, các chuyển đổi lửa và ném một ngoại lệ bởi vì "-" không phải là một chuỗi phân tích cú pháp, và giá trị được hoàn nguyên.

Tôi nghĩ vấn đề là khá rõ ràng, vì vậy bây giờ tôi sẽ dán một số mã.

Cột trụ dùng cho người dùng nhập vào sẽ xuất hiện như sau:

<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}" /> 

datagrids tất cả các cổ phiếu cùng một phong cách:

<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"/> 

ý rằng UpdateSourceTrigger được thiết lập để CellEndingEdit. Tôi đã nghĩ rằng quyền này ở đây sẽ có trách nhiệm khi các trình biến đổi được gọi và giá trị giới hạn được cập nhật. Bất cứ điều khiển nào thay đổi chỉ bằng cách chuyển đổi .NET4.

Dưới đây là các mẫu dữ liệu cho các cột mà bạn đã thấy sử dụng trên:

<!-- 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> 

Tôi nghĩ rằng mã chuyển đổi chính nó là không thích hợp, vì vậy tôi sẽ để nó ra trừ khi nó được yêu cầu. Vấn đề là nó được gọi là mọi phím tắt.

Nếu bạn có thể làm sáng tỏ điều này, tôi sẽ ngây ngất. Ý tôi là, tôi có thể phải khôi phục tất cả các cải tiến .NET 4.0 của tôi, hoặc trì hoãn bản phát hành tiếp theo của tôi bằng cách viết lại tất cả các dữ liệu của tôi để không còn sử dụng xceed nếu không có giải pháp cho điều này. Cảm ơn các bạn.


Update # 1

Tôi thực sự đã đưa ra một cách giải quyết khá thông minh (theo ý kiến ​​khiêm tốn của tôi) mà tôi giới thiệu một TextBlock giả để giữ lực lượng CellEditorBinding Xceed chúng tôi sử dụng trong datatemplate. Sau đó tôi đã thay đổi điều khiển đầu vào của mình để liên kết với thuộc tính văn bản của textblock thay vì trực tiếp CellEditorBinding, cho phép tôi chỉ định chế độ ràng buộc của riêng mình. Ở đây tôi đã có thể đặt chế độ thành 'lostFocus' và vấn đề chính đã được giải quyết! Trình chuyển đổi không còn được gọi trên mỗi lần nhấn phím, nhưng chỉ khi người dùng rời khỏi ô hoặc lần truy cập.

<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> 

Như bạn có thể tưởng tượng, lớp hướng dẫn này đã gây ra một số vấn đề nhỏ khác, chẳng hạn như vi phạm xác thực. Oddly đủ, bây giờ khi người sử dụng loại dữ liệu không hợp lệ, chuyển đổi ném một ngoại lệ mà xceed bắt và sử dụng để bật mẫu lỗi của tế bào, nhưng sửa lỗi và nhấn enter không còn hoạt động. Tùy chọn duy nhất của người dùng là nhấn phím ESC, làm cho giá trị ô trở lại và mất tiêu điểm, trước khi chúng có thể sửa mục nhập của chúng.

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.

Tôi vẫn đang hy vọng một giải pháp thanh lịch hơn sẽ khắc phục điều này.


Update # 2

Tôi tìm thấy một nhà phát triển trên diễn đàn hỗ trợ Xceed đó trình bày các vấn đề tương tự như tôi trong bài viết này: http://silverlightdatagrid.com/CS/forums/permalink/31548/31516/ShowThread.aspx#31516.

Nhiều người dùng dường như hoàn toàn nhầm lẫn bởi những ví dụ của bạn (mà phần lớn đã cũ cho Net 4.0) và chỉ nhắm mục tiêu điều khiển của riêng bạn sử dụng các xcdg: CellEditorBinding mà dường như chỉ hỗ trợ PropertyChanged xác nhận.

Rất tiếc, không có giải pháp nào được cung cấp. Ông đã trình bày một chiến lược để thay đổi kích hoạt nguồn cập nhật một cách tao nhã hơn mà tôi đã có thể chấp nhận, nhưng tôi vẫn gặp vấn đề về lỗi xác nhận đóng băng ô cho đến khi người dùng nhấn ESC.

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

Update # 3

Tôi đã xác nhận rằng bằng cách cập nhật Xceed DataGrid phiên bản 4.3 (xét xử), vấn đề đi đi tất cả các ngày của riêng mình, như trong phiên bản đó, Xceed đã cập nhật xcdg:CellEditorBindingUpdateSourceTrigger không tương thích với .Net4.0. Tuy nhiên, vì giấy phép cho Xceed chỉ bao gồm 6 tháng cập nhật sửa lỗi trước khi bạn phải thanh toán toàn bộ giấy phép mới (vô lý) và tôi không thấy bất kỳ công ty nào cho phép một khoản phí giấy phép nhà phát triển duy nhất 1200 đô la để sử dụng Dll Xceed mới nhất chỉ dành cho một lỗi nhỏ này, tôi vẫn sẽ cố gắng tìm một giải pháp hoàn chỉnh trong phiên bản 3.7 của Xceed. Tôi sẽ trình bày 'giải pháp' này cho các nhà phát triển có quyền truy cập vào tiền để ghi.

Khi nó quay ra, nâng cấp lên 4.3 đã không giải quyết được sự cố. Nó chỉ xuất hiện bởi vì tôi đã quên quay trở lại sự thay đổi trước đó của tôi. Ngay cả trong phiên bản mới nhất, Xceed vẫn chưa hiển thị thuộc tính UpdateSourceTrigger trên số CellEditorBinding.

+0

Nếu nó được gọi là mọi đột quỵ chính, thì có vẻ như sự ràng buộc đang sử dụng 'UpdateSourceTrigger = PropertyChanged'. Hãy thử thêm nó vào liên kết của bạn và thiết lập để 'LostFocus' thay thế, hoặc thay thế' xcdg: CellEditorBinding' với một ràng buộc thường xuyên. – Rachel

+0

Không có mã nào chịu trách nhiệm về việc thiết lập ràng buộc. DataGrid xử lý mọi thứ cho thuộc tính "FieldName" trên cột được liên kết với một tập hợp nguồn. Tôi muốn gợi ý về cách thay thế xcdg: CellEditorBinding. Tôi đã có ấn tượng rằng xceed đơn giản là không làm việc theo bất kỳ cách nào khác. – Alain

Trả lời

3

Giải pháp là:

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

Có thực sự không có cách nào khác để làm điều đó. Nếu bạn không sử dụng phiên bản Xceed mới nhất, điều này cũng sẽ dẫn đến lỗi xác thực, nhưng trong phiên bản mới nhất, sử dụng đường dẫn ràng buộc mới này hoạt động hoàn hảo. Tôi vẫn nghĩ rằng đó là một hack, và hy vọng xceed sẽ nhận ra nó cần để lộ một vài tài sản trên CellEditorBinding của nó.

0

Tôi không biết điều khiển XCeed, vì vậy đây chỉ là phỏng đoán được giáo dục.

Cá nhân tôi sẽ đặt UpdateSourceTrigger để tuyên bố ràng buộc như nó được thực hiện trong một điều khiển .NET thường xuyên:

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

Ngoài ra, vì sự kiểm soát là thương mại, bạn nên được hưởng một số hỗ trợ kỹ thuật từ Xceed .

+1

Đó là một gợi ý hợp lý để thực hiện, nhưng xcdg: CellEditorBinding không có thuộc tính UpdateSourceTrigger: [class members] (http://doc.xceedsoft.com/products/xceedwpfdatagrid/Xceed.Wpf.DataGrid.v4.2~ Xceed.Wpf.DataGrid.Markup.CellEditorBindingExtension_members.html). Xceed xử lý việc gắn kết với nội dung trình soạn thảo bằng tham số "FieldName" của cột hiện tại. – Alain