WPF ValueConverter – Standard per unconvertible valore

Nel corso dell’ultimo anno o giù di lì ho visto molti diversi convertitori di valore per molti scopi diversi, da diversi autori. Una cosa che si attacca nella mia mente è la grande varianza di ‘default’, valori che sono tornato da loro. Per esempio;

  public class MyConverter: IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      //OK, we test for some undesirable, unconvertable situation, typically null...
      if (value == null)
      {
        //And here are a variety of 'defaults' that I have seen, these begin the most typical.
        return null;
        return DependencyProperty.UnsetValue;
        return Binding.DoNothing;
      }
        //...... other code.. whatever...
}}

Quindi la mia domanda è, c’è un ‘standard’ per indicare che un valore di input non può essere convertito?

InformationsquelleAutor A.R. | 2011-05-13



6 Replies
  1. 28

    Secondo MSDN – IValueConverter:

    Il motore di associazione dati non cattura le eccezioni generate da un
    utente fornito dal convertitore. Qualsiasi eccezione che viene generata dalla Conversione
    metodo, o qualsiasi uncaught le eccezioni generate da metodi che la
    Convertire le chiamate di metodo, sono trattati come errori di run-time. Maniglia
    problemi del previsto, restituendo DependencyProperty.UnsetValue.

    La chiave della linea è Gestire problemi del previsto, restituendo DependencyProperty.UnsetValue.

    • Ma qual è la reale pratica differenza tra DependencyProperty.UnsetValue e Binding.DoNothing? I documenti non sono molto chiaro qui. In che modo il motore di associazione a comportarsi in modo diverso in questi due casi?
    • Vedere questa risposta: stackoverflow.com/a/10385121/347172 … in pratica, Binding.DoNothing si ferma il motore di associazione nella sua tracce, mentre DependencyProperty.UnsetValue racconta il motore di associazione per utilizzare il FallbackValue invece.
  2. 23

    Quando si guarda a questi valori si scoprire che cosa significano. Poi scegliere quello giusto per tornare nel vostro convertitore.

    Il problema principale è che null, potrebbe essere un valore valido per la proprietà.

    DependencyProperty.UnsetValue per indicare che la proprietà esiste, ma non il valore impostato dal sistema di proprietà

    Vincolanti.DoNothing per istruire il motore di associazione a non trasferire un valore per la destinazione di associazione, di non passare alla successiva Vincolanti in un PriorityBinding, o di non utilizzare il FallBackValue o valore di default

    MODIFICA

    Per indicare che non è possibile convertire il valore che si deve semplicemente restituire il valore dato. Che è la migliore che si può fare, perché restituisce il problema all’autore dell’attacco. Se si immischiarsi con il valore, diventa molto difficile trovare quello che sta succedendo.

    • OK, ha senso. Credo che, in molti casi, questo sarà vento per essere un’eccezione. Pensi che la generazione di un’eccezione all’interno del convertitore di per sé sarebbe un approccio migliore?
    • No. Mai rompere un legame. Vedi: stackoverflow.com/questions/2453745/… e stackoverflow.com/questions/4944553/…
    • Beh, sembra che il consenso è per tornare DependencyProperty.UnsetValue
    • Ben 2 voti non è il consenso IMHO. Il propblem con unsetvalue è che più o meno indica che il valore non è impostato, mentre in questo caso il valore è sapere, ma non siamo in grado di convertirlo. (È per questo che questa risposta è stato trombato?)
    • Che è sicuramente un aspetto negativo di UnsetValue, ma tornando permetterà l’utilizzo di ‘FallbackValue’ dell’associazione, consentendo all’utente finale decidere che cosa è il ‘default’ dovrebbe essere. Inoltre, ci sono una serie di scenari in cui il valore è utile: msdn.microsoft.com/en-us/library/ms745795.aspx#Advanced Alla fine della giornata, sto cercando di venire con un ragionevole e flessibile standard per la mia organizzazione.
    • +1 per il ritorno di DependencyProperty.UnsetValue. Se lo fai, WPF mostra un errore di convalida e il messaggio di errore è “Valore” … “non può essere convertito”. Esattamente quello che stavo cercando. Anche se WPF si comporta quando si ritorna semplicemente non convertito valore.

  3. 5

    Dopo molto pensare e a scavare intorno, sembra che DependencyProperty.UnsetValue è la scelta più appropriata. Ho spostato tutto in casa oltre a questo modello con molto successo. Inoltre, il testo nelle “Osservazioni” sezione di questa pagina indica che a me, questa è probabilmente la scelta migliore..

    C’è anche qualche discussione sulla restituzione del valore di input se un’associazione non può essere convertito, ma questo può facilmente “rompere” il sistema di rilegatura. Pensare ad un caso in cui l’associazione di ingresso è una ‘stringa’ e l’uscita è un “pennello”. Ritorna una stringa non è andare a lavorare!

    • +1. Tornando DependencyProperty.UnsetValue è la giusta scelta secondo la documentazione.
  4. 2

    che si ritorna come valore predefinito dipende dalla situazione. Non si desidera restituire un int come predefinito per un convertitore per un valore booleano, o restituire un valore booleano per un convertitore per la visibilità enum.

  5. 1

    Di solito se un valore non può essere convertito, butto un Exception

    Questo perché se io sto cercando di convertire un valore non valido converter, mi piacerebbe essere avvisato quando così posso modificare il mio codice.

    In alcuni rari casi, un valore può essere valido anche se non può essere convertito, e in quel caso io di solito restituiscono lo stesso valore che è stato passato al convertitore. Questo è utilizzato solo se voglio che il valore da convertire, se possibile, o rimanere lo stesso, se non.

    Un altro raro caso, che ho fatto in occasione di specificare un valore di default. Questo di solito è fatto quando so che il Convertitore può essere utilizzato con un parametro non valido, e voglio restituire un valore valido, non importa che cosa il risultato è. Il mio hard-coded di default convertitori quasi sempre restituire valori booleani.

    Non credo di avere mai tornato nessuno dei 3 è specificato (null, DependencyProperty.UnsetValue, o Binding.DoNothing) perché questi valori sono spesso impreviste e non è facile da notare se non si e specificamente per loro.

    • Sì, forse, ma penso che la maggior parte della comunità, etc. accetta che rompere il sistema di rilegatura (lanciando un’eccezione) è il modo sbagliato di andare. Ho avuto un crash designer a me circa un migliaio di volte quando ho usato quel metodo, o di runtime di crash che è anche peggio….

Lascia un commento