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.
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:CellEditorBinding
UpdateSourceTrigger
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
.
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
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