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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich ein wenig Graben auf dem Internet, und es stellt sich heraus, diese war gebrochen in WPF 4. Jemand mit einem fast identischen problem für mich hier gepostet:
http://www.go4answers.com/Example/textbox-shows-old-value-being-coerced-137799.aspx
'Antwort 8' Staaten dieser defekt war in WPF 4 und schlägt vor, eine Lösung zu finden, die auch tatsächlich zu nutzen
UpdateSourceTrigger="Explicit"
aber Sie behandeln das TextChanged-Ereignis und rufen Sie BindingExpression.UpdateSource() zu erzwingen änderungen in das Textfeld ein, um sich in den zugrunde liegenden Wert als wennUpdateSourceTrigger="PropertyChanged"
, laut diesem post:Zwingen eine WPF TextBox nicht mehr funktioniert .NET 4.0
Ich umgesetzt, aber lo und siehe, es wurden weitere Nebenwirkungen, insbesondere, dass jede Taste verursacht den Cursor zu springen an den Anfang der text-box, aufgrund der Aktualisierung der Quelle und Erziehung eines PropertyChanged Veranstaltung. Und auch, führende oder nachgestellte Nullen bzw. der Dezimalstellen eingegeben mit der Absicht, die Eingabe von weiteren Ziffern bekommen würde ausgelöscht sofort. Also, eine einfache Bedingung zu überprüfen, die analysiert dezimal-Wert der text-box gegenüber dem Basiswert aufgelöst.
Dem folgenden event-handler ist alles, was benötigt wurde:
InformationsquelleAutor Neo