Frage

In meinem WPF-Anwendung habe ich eine TextBox in dem der Benutzer einen bestimmten Prozentsatz (wie int, zwischen 1 und 100) eingeben. Die Text-Eigenschaft ist Databound auf eine Eigenschaft in einem Ansichtsmodell, wo ich den Wert coerce im angegebenen Bereich in dem Setter sein.

Doch in .NET 3.5, werden die Daten nicht korrekt in der Benutzeroberfläche angezeigt, nachdem dazu gezwungen werden. In diesen Beitrag auf MSDN , so Dr. WPF, dass Sie manuell die Bindung zu aktualisieren, damit die korrekten wird gezeigt haben. Deshalb habe ich einen TextChanged Handler (in der Ansicht), die UpdateTarget() aufruft. In dem Code ein:

Ansicht XAML:

<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue={x:Static sys:String.Empty}}"
    TextChanged="TextBox_TextChanged"/>

Ansicht Code-Behind:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // Removed safe casts and null checks
    ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}

Ansichtsmodell:

private int? percentage;
public int? Percentage
{
    get
    {
        return this.percentage;
    }

    set
    {
        if (this.Percentage == value)
        {
            return;
        }

        // Unset = 1
        this.percentage = value ?? 1;

        // Coerce to be between 1 and 100.
        // Using the TextBox, a user may attempt setting a larger or smaller value.
        if (this.Percentage < 1)
        {
            this.percentage = 1;
        }
        else if (this.Percentage > 100)
        {
            this.percentage = 100;
        }
        this.NotifyPropertyChanged("Percentage");
    }
}

Leider ist dieser Code bricht in .NET 4.0 (gleicher Code, einfach geändert TargetFramework bis 4,0). Insbesondere wird, nachdem ich den Wert zum ersten Mal dazu gezwungen, ignoriert die TextBox irgendwelche weiteren Werte dazu gezwungen, solange ich ganzzahlige Werte zu übernehmen weiter (da ich bin zu einem int-Bindung).

Wenn ich also "123" eingeben, nach den 3 I den Wert "100" zu sehen. Nun, wenn ich „4“, der Setter im Ansichtsmodell erhält den Wert „1004“ eingeben, die sie nötigt bis 100. Die Textchanged-Ereignis dann ausgelöst (und der Absenders TextBox.Text „100“!), Aber die TextBox zeigt " 1004" . Wenn ich dann "5" eingeben, erhält der Einrichter den Wert "10045", etc.

Wenn ich dann geben Sie einen „a“, plötzlich die TextBox zeigt den richtigen Wert, das heißt „100“. Das gleiche geschieht, wenn ich weiterhin Zahlen einzugeben, bis der int überläuft.

Wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Versuchen Sie in XAML Explicit statt Property mit:

<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=Explicit, TargetNullValue={x:Static System:String.Empty}}"
             TextChanged="TextBox_TextChanged" />

und im Code hinter Update statt Update

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        // Removed safe casts and null checks
        ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }

es getestet und es funktioniert. Btw wird dieses Problem wahrscheinlich in einer späteren Version von .NET behoben werden.

Andere Tipps

Sie können die Property verwenden. Allerdings versuchen, auf die EditValueProperty Abhängigkeit anstelle der Textproperty Abhängigkeit (oder Ereignisse) zu binden. Es funktioniert wie gewünscht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top