Forzare la Conversione di eseguire sempre quando si utilizza convertitore personalizzato in WPF?

StackOverflow https://stackoverflow.com/questions/779243

  •  13-09-2019
  •  | 
  •  

Domanda

Sto implementando una data personalizzata converter in WPF, l'idea di essere più intelligente sulla data entry, una la di Outlook (essere in grado di entrare in "oggi", etc.) Così ho scritto la mia converter, che è il lavoro.Formati voce dell'utente in formato g/M/aa.Così, per esempio, se entrano:8-2, che vedrà 8/2/09.Bella.

La domanda è:ci sono diverse cose che l'utente può inserire che il risultato finale di una stessa data.(8-2 e 8/2, facili esempi).Quindi diciamo che inizia inserendo 8/2, che viene eseguito attraverso ConvertBack e la Conversione, e viene visualizzato come 8/2/09.Finora tutto bene.Ora diciamo che entrano 8-2 (o 8/2 nuovo) in quello stesso campo, subito dopo.Che viene eseguito se ConvertBack, che produce la STESSA data già presenti nel limite di proprietà, in modo da non si preoccupano di eseguire la Conversione, il che significa che che "8/2" è lì, seduto nella casella di testo.Yick!Non c'è nessun problema di dati, solo un display, ma hey, la pulizia conta.

Come posso forzare WPF per eseguire la Conversione, dopo TUTTO (non errore) voci?

Qui è una versione semplificata del convertitore:

    public class DateConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string tempStr = value.ToString();
            return ((DateTime.Parse(tempStr)).ToString("M/d/yy"));
        }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return DateTime.Parse(value.ToString());
    }

    #endregion
}

ed ecco che l'uso di esso si presenta come:

      <local:FilteredTextBox.Text>
        <Binding Path="Value" ElementName="root" Converter="{StaticResource DateConv}" 
           UpdateSourceTrigger="LostFocus"  Mode="TwoWay" diagnostics:PresentationTraceSources.TraceLevel="High"
        NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
          <Binding.ValidationRules>
                <local:DateValidation/>
          </Binding.ValidationRules>
        </Binding>
      </local:FilteredTextBox.Text>

Grazie!Scott

In risposta a un commento qui di seguito, ecco la proprietà di supporto:

      public DateTime? Value
    {
        get
        {
            return (DateTime?)GetValue(ValueProperty);
        }
        set
        {
            SetValue(ValueProperty, value);
            OnPropertyChanged(new DependencyPropertyChangedEventArgs(ValueProperty, null, value)); // I just added this line, it makes no difference
        }
    }
È stato utile?

Soluzione 2

Molte grazie a Josh G - con il suo aiuto, ho capito (o almeno una) risposta.

Questo è stato per una casella di testo all'interno di un controllo DatePicker sto creando.Quindi, piuttosto che "blocca" la casella di testo direttamente il valore del controllo, ho creato un intermedio di proprietà, che QUINDI chiama il set per la proprietà di dipendenza:

  public DateTime? DateValue
    {
        get
        {
            return _dateValue;
        }
        set
        {
            _dateValue = value;
            OnPropertyChanged("DateValue");
            SetValue(ValueProperty, _dateValue);
        }
    }

e questo funziona tutto come dovrebbe.Grazie ancora, Josh!

Altri suggerimenti

E 'possibile che la proprietà dei dati di supporto viene solo sparando PropertyChanged se cambia realmente valore? Si potrebbe provare a sparare PropertyChanged ogni volta che la funzione set viene chiamata indipendentemente dal fatto che il valore cambia. Ciò causerebbe l'associazione da aggiornare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top