Порядок исполнения в текстовом поле WPF - PullRequest
1 голос
/ 27 сентября 2010

У меня проблема с конвертером форматирования и проверкой данных.У меня есть следующее текстовое поле XAML объявление

<TextBox FontFamily="Segoe" FontSize="16" FontWeight="Medium"
    TabIndex="{Binding TabBinding}"  Foreground="Black"
    Opacity="0.9" IsTabStop="True" Uid="{Binding PriceID}"
    Text="{Binding NewPrice,Converter={StaticResource FormattingConverter},
    ConverterParameter=' \{0:C\}', Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
    Background="#FFE6DED3" BorderBrush="#FFE6DED3"
    DataContext="{Binding StringFormat=\{0:c\}, NotifyOnValidationError=True}"
    Padding="0" KeyDown="TextBox_KeyDown" AcceptsReturn="False">
</TextBox>

Проблема, с которой я столкнулся, - это проблема проверки данных.Когда пользователь вводит недопустимую цену (например, значение «abc» или «0.0.4»), текстовое поле пытается выполнить преобразование в методе «FormattingConverter».(Метод ConvertBack вставлен ниже) Это вызывает исключение и ошибки программы.Есть ли способ отложить вызов FormattingConverter или обойти его, если данные в текстовом поле неверны?

public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{
    var objTypeConverter = System.ComponentModel.TypeDescriptor.GetConverter(targetType);
    object objReturnValue = null;

    if (objTypeConverter.CanConvertFrom(value.GetType())) {
        objReturnValue = objTypeConverter.ConvertFrom(value.ToString().Replace("$", ""));
    }

    return objReturnValue;
}

Спасибо,

1 Ответ

1 голос
/ 27 сентября 2010

ConvertBack конвертера всегда запускается для преобразования данных в значение, подходящее для целевого объекта.Преобразователь отвечает за обработку исключений (и в случае исключения возвращает исходное значение, чтобы структура привязки также поняла, что это недопустимое значение).

public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)  
{ 
    var objTypeConverter = System.ComponentModel.TypeDescriptor.GetConverter(targetType); 
    // Default return value is the original value - if conversion fails, return
    // this value so the binding framework will see an invalid value (and not 
    // just null).
    object objReturnValue = value; 

    if (objTypeConverter.CanConvertFrom(value.GetType())) { 
        try {
            objReturnValue = objTypeConverter.ConvertFrom(value.ToString().Replace("$", "")); 
        }
        catch( FormatException ) { }
        // Catch all of your possible exceptions and ignore them by returning the original value
    } 

    return objReturnValue; 
} 

Вы также можете вернуть DependencyProperty.UnsetValue, однако на практике я предпочитаю видеть фактическое сообщение об ошибке, возвращаемое при проверке из недопустимого значения, а не просто возвращать неустановленное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...