Какова лучшая практика для IValueConverter? - PullRequest
5 голосов
/ 09 февраля 2011
  • Каков наилучший метод для IValueConverter ?
  • Можно ли помещать исключение в метод Convert или оно должно возвращать "что-то"?

Вот пример:

[ValueConversion(typeof(float), typeof(String))]
public class PercentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString()))
            return string.Empty;

        if (value is float) //Edited to support CultureInfo.CurrentCulture,
            return string.Format(culture, "{0:n}{1}", ((float)value) * 100, "%");

        //** Is it ok to put Exception here or should I return "something" here? **
        throw new Exception("Can't convert from " + value.GetType().Name + ". Expected type if float.");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Converting back is not implemented in " + this.GetType());
    }
}

Ответы [ 3 ]

13 голосов
/ 09 февраля 2011

Если вам не удалось преобразовать (искаженные значения, типы, ...), верните DependencyProperty.UnsetValue .

Указывает, что преобразователь не выдал значения и что привязка использует FallbackValue, если доступно, или значение по умолчанию.

Кроме того, вы должны конвертировать данные с учетом конкретной культуры или инвариантными преобразованиями, чтобы быть в безопасности.

5 голосов
/ 09 февраля 2011

Я лично рекомендую использовать синглтон-конвертеры. Тогда вам не нужно создавать экземпляр на каждом сайте использования, но вы можете ссылаться на конвертер так:

Converter={x:Static SomeNamespace:SomeConverter.Instance}
2 голосов
/ 09 февраля 2011

Вы проигнорировали CultureInfo при разборе строки.

Всегда принимайте во внимание передаваемую информацию о культуре, иначе она всегда будет работать с CurrentCulture Thread.

Я мог бы дать что-то вроде "7.34,123" в качестве ввода, ваш код будет работать?

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