2012-01-25 11 views
6

Ho riscontrato un problema con l'immissione di dati dal passaggio a .NET 4.0. Nella mia griglia Xceed 3.7, l'utente era solito essere in grado di digitare un valore in una cella, e quando facevano clic su Invio o su Invio, veniva chiamato il metodo ConvertBack del convertitore associato, analizzando il valore di input dell'utente e memorizzandolo nel formato desiderato .I convertitori vengono richiamati ogni volta che si preme il tasto anziché alla fine dell'input dell'utente

Ora tutto ad un tratto, questo sta accadendo ogni battitura - che sta causando un problema enorme, perché se l'utente cancella un numero e inizia a digitare un altro, (diciamo -100), non appena si digita il segno negativo, la conversione scocca e genera un'eccezione perché "-" non è una stringa analizzabile e il valore viene ripristinato.

Penso che il problema sia abbastanza chiaro, quindi ora inserirò del codice.

Colonne per l'input dell'utente appaiono come segue:

<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 condividono tutti lo stesso stile:

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

noti che UpdateSourceTrigger è impostato a CellEndingEdit. Avrei pensato che questo qui sarebbe stato responsabile per quando i convertitori vengono chiamati e il valore associato viene aggiornato. Qualunque controllo che sia cambiato cambiando semplicemente .NET4.

Ecco il modello di dati per la colonna Sega usati sopra:

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

Credo che il codice convertitore stesso è irrilevante, quindi lascio fuori meno che non sia richiesto. Il problema è che viene chiamato ogni tasto.

Se riesci a far luce su questo, sarei estasiato. Voglio dire, potrei dover ripristinare tutti i miei miglioramenti a .NET 4.0, o ritardare la mia prossima release di un mese riscrivendo tutti i miei datagrids per non utilizzare più xceed se non c'è una soluzione a questo. Grazie ragazzi.


Update # 1

Io in realtà si avvicinò con una soluzione moderatamente intelligente (a mio modesto parere) dove introduco un blocco di testo fittizio per contenere le forze CellEditorBinding Xceed di usare nel DataTemplate. Ho quindi modificato il controllo di input per associare direttamente la proprietà textblock al testo anziché a CellEditorBinding, il che mi ha permesso di specificare la mia modalità di binding. Qui sono stato in grado di impostare la modalità su "lostFocus" e il problema principale è stato risolto! Il convertitore non viene più richiamato su ogni sequenza di tasti, ma solo quando l'utente lascia la cella o gli hit entrano.

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

Come potete immaginare, però, questo livello di riferimento indiretto ha causare un paio di altre questioni minori, come ad esempio la rottura di convalida. Stranamente, ora quando l'utente digita i dati non validi, il convertitore genera un'eccezione che xceed intercetta e utilizza per attivare il modello di errore della cella, ma correggere l'errore e premere invio non funziona più. L'unica opzione dell'utente è di premere il tasto ESC, facendo in modo che il valore della cella si ripristini e perda la messa a fuoco, prima che possano correggere la loro immissione.

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.

sto ancora sperando in una soluzione più elegante che risolverà questo.


Aggiornamento # 2

ho trovato uno sviluppatore sul forum di supporto Xceed che hanno presentato lo stesso problema come me in questo post: http://silverlightdatagrid.com/CS/forums/permalink/31548/31516/ShowThread.aspx#31516.

Molti utenti sembrano totalmente confusi dai vostri esempi (che sono in gran parte fuori della data per il .Net 4.0) e solo colpiscono i propri controlli utilizzando il xcdg: CellEditorBinding che sembra solo per supportare la convalida PropertyChanged.

Purtroppo nessuna soluzione è mai stata offerta. Ha presentato una strategia per modificare in modo più elegante la sorgente di aggiornamento che sono stato in grado di adottare, ma ho ancora il problema dell'errore di validazione che blocca la cella finché l'utente non ha premuto ESC.

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

Update # 3

mi hanno confermato che l'aggiornamento alla Xceed DataGrid versione 4.3 (sotto processo), il problema è andato via per conto suo, come in quella versione, Xceed ha aggiornato la sua incompatibilità xcdg:CellEditorBindingUpdateSourceTrigger con .Net4.0. Dal momento che, tuttavia, una licenza per Xceed include solo 6 mesi di aggiornamenti delle correzioni dei bug prima di dover pagare per una nuova licenza (ridicola), e non vedo alcuna compagnia che autorizzi una tariffa di licenza per sviluppatore singola da $ 1200 oltraggiosa da utilizzare l'ultima Xceed dll solo per questo piccolo bug, sto ancora cercando di trovare una soluzione completa nella versione 3.7 di Xceed. Presenterò questa 'soluzione' per gli sviluppatori che hanno accesso ai soldi da masterizzare.

Come risulta, l'aggiornamento a 4.3 non ha risolto il problema. Sembrava solo perché avevo dimenticato di annullare il mio precedente cambiamento. Anche nell'ultima versione, Xceed non ha ancora esposto la proprietà UpdateSourceTrigger su CellEditorBinding.

+0

Se viene chiamato ogni tratto di chiave, sembra che l'associazione utilizzi 'UpdateSourceTrigger = PropertyChanged'. Prova ad aggiungerlo al binding e imposta su 'LostFocus', oppure sostituendo' xcdg: CellEditorBinding' con un binding regolare. – Rachel

+0

Non c'è alcun codice responsabile per l'impostazione dell'associazione. Il datagrid gestisce tutto dato la proprietà "FieldName" sulla colonna associata a una raccolta di origine. Vorrei suggerimenti su come sostituire xcdg: CellEditorBinding. Avevo l'impressione che xceed semplicemente non funzionasse in nessun altro modo. – Alain

risposta

3

La soluzione è:

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

Non c'è davvero nessun altro modo per farlo. Se non si utilizza l'ultima versione di Xceed, ciò comporterà anche errori di convalida, ma nella versione più recente, l'utilizzo di questo nuovo percorso di associazione funziona perfettamente. Continuo a pensare che sia un trucco, e spero che xceed capisca che ha bisogno di esporre qualche altra proprietà sul suo CellEditorBinding.

0

Non conosco i controlli XCeed, quindi questa è solo un'ipotesi plausibile.

io personalmente posizionare l'UpdateSourceTrigger alla dichiarazione vincolante, come si è fatto in un controllo regolare NET:

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

Inoltre, dal momento che il controllo è commerciale, si dovrebbe avere diritto a qualche supporto tecnico da XCEED .

+1

Questo è un suggerimento ragionevole da fare, ma xcdg: CellEditorBinding non ha una proprietà UpdateSourceTrigger: [membri della classe] (http://doc.xceedsoft.com/products/xceedwpfdatagrid/Xceed.Wpf.DataGrid.v4.2~ Xceed.Wpf.DataGrid.Markup.CellEditorBindingExtension_members.html). Xceed si occupa di collegare l'associazione al contenuto dell'editor utilizzando il parametro "FieldName" della colonna corrente. – Alain

Problemi correlati