Text über TextBox mit UpdateSourceTrigger=PropertyChanged wird nicht aktualisiert, wenn die Umwandlung von text-Eingabe Ergebnisse in unveränderter Quelle Wert

Habe ich ein Textfeld, dessen Text Eigenschaft hat eine TwoWay MultiBinding mit UpdateSourceTrigger eingestellt PropertyChanged. Die ersten Bindung ist eine Abhängigkeitseigenschaft (Wert), die eine PropertyChangedCallBack - Funktion rundet den Wert auf eine Nachkommastelle.

Dem Zweck, das text-Feld ist, führen Sie die Rundung der Benutzer, sondern Typen, wenn das Textfeld den Fokus verliert, also warum UpdateSourceTrigger eingestellt ist PropertyChanged.

Das problem ich habe, ist, dass, wenn text eingegeben wird, der NICHT zu Wert ändern, die Text Eigentum und Wert geworden out of sync. Nur wenn die rundungsoperation Ursachen Wert ändern tut Text aktualisiert werden on the fly. E. g., wenn Text und Wert sind beide 123.4 und der Benutzer-Typen 1 nach dieser, Wert abgerundet wird auf den gleichen Wert (123.4), aber Text zeigt 123.41. Allerdings, wenn 9 wird dann eingegeben werden, nachdem die 4, Wert ist gerundet bis zu 123.5. Und aufgrund dieser tatsächlichen Veränderung, Text wird dann aktualisiert, um die gleiche (123.5).

Gibt es eine Möglichkeit zu zwingen, eine text-box, update von seiner Quelle, auch wenn die Quelle nicht geändert hat, seit der Letzte Auslöser? Ich habe versucht mit BindingExpressionBase.UpdateTarget() aber dies funktioniert nur, wenn UpdateSourceTrigger eingestellt ist Explizite, die nicht verwendet werden können, wie Wert nicht mehr aktualisiert wird, bevor ein geeigneter Zeitpunkt, wo UpdateTarget bezeichnet werden könnte (wie ein TextInput handler). Ich habe versucht, andere Methoden wie explizit die Aktualisierung der Text Wert aus der gebundenen Wert, zwingt eine tatsächliche änderung Wert vorübergehend aufrufen, eine Aktualisierung, aber diese "hacks", die entweder nicht funktionieren oder andere Probleme verursachen.

Jegliche Hilfe würde sehr geschätzt werden.

Den code unten ist.

XAML-Ausschnitt

<TextBox>
  <TextBox.Text>
    <MultiBinding Converter="{local:NumberFormatConverter}"
                  UpdateSourceTrigger="Explicit"
                  Mode="TwoWay">
      <Binding Path="Value"
               RelativeSource="{RelativeSource AncestorType={x:Type Window}}"
               Mode="TwoWay" />
    </MultiBinding>
  </TextBox.Text>
</TextBox>

C# - snippet

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(
        "Value", typeof(decimal), typeof(MainWindow),
        new FrameworkPropertyMetadata(0m,
        new PropertyChangedCallback(OnValueChanged)));

private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    obj.SetValue(ValueProperty, Math.Round((decimal)args.NewValue, 1));
}

Converter-Klasse erforderlich

public class NumberFormatConverter : MarkupExtension, IMultiValueConverter
{
    public static NumberFormatConverter Instance { private set; get; }

    static NumberFormatConverter()
    {
        Instance = new NumberFormatConverter();
    }

    public override object ProvideValue(IServiceProvider serviceProvider_)
    {
        return Instance;
    }

    #region Implementation of IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values[0].ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        var result = 0m;
        if (value != null)
        {
            decimal.TryParse(value.ToString(), out result);
        }
        return new object[] { result };
    }

    #endregion
}

InformationsquelleAutor Neo | 2010-11-08

Schreibe einen Kommentar