Принудительно не работает больше текстового поля WPF в .NET 4.0 - PullRequest
5 голосов
/ 11 октября 2010

В моем приложении WPF у меня есть TextBox, где пользователь может ввести процент (как int, от 1 до 100). Свойство Text привязано к свойству в ViewModel, где я устанавливаю значение в заданном диапазоне в установщике.

Однако в .NET 3.5 данные не отображаются должным образом в пользовательском интерфейсе после принудительной обработки. В этой публикации на MSDN Dr. WPF заявляет, что вам необходимо вручную обновить привязку, чтобы отобразить правильную. Поэтому у меня есть обработчик TextChanged (в представлении), который вызывает UpdateTarget(). В коде:

Просмотр XAML:

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

Просмотреть код позади:

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

ViewModel:

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");
    }
}

К сожалению, этот код ломается в .NET 4.0 (тот же код, просто изменивший TargetFramework на 4.0). В частности, после того, как я впервые ввел значение, TextBox игнорирует любые дальнейшие значения, пока я продолжаю вводить целочисленные значения (поскольку я связываюсь с int).

Так что, если я введу «123», то после 3 я увижу значение «100». Теперь, если я введу «4», установщик в ViewModel получает значение «1004», которое приводит к 100. Затем вызывается событие TextChanged (и TextBox.Text отправителя равен «100»!), Но TextBox показывает 1004" . Если я затем введу «5», установщик получит значение «10045» и т. Д.

Если я затем введу «а», вдруг TextBox покажет правильное значение, то есть «100». То же самое происходит, если я продолжаю вводить числа до тех пор, пока int не переполнится.

Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 11 октября 2010

Попробуйте использовать в xaml Explicit вместо PropertyChanged:

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

и в коде за UpdateSource вместо UpdateTarget

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

Протестировано и все работает.Кстати, эта проблема, вероятно, будет решена в более поздней версии .NET.

0 голосов
/ 22 июля 2016

Вы можете использовать PropertyChanged.Однако попробуйте связать с зависимостью EditValueProperty вместо зависимости TextProperty (или событий).Это будет работать как нужно.

...