Привязка данных Wpf с использованием IMultiValueConverter и ошибок приведения

StackOverflow https://stackoverflow.com/questions/1477482

Вопрос

В рамках изучения WPF я только что закончил выполнять упражнение MS Lab под названием "Использование привязки данных в WPF" (http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx).

Чтобы проиллюстрировать использование IMultiValueConverter, существует предварительно закодированная реализация одного из них, где логический результат используется для определения того, является ли привязка данных релевантной для текущего пользователя.Вот код для операции преобразования:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        // var rating = int.Parse(values[0].ToString());
        var rating = (int)(values[0]);
        var date = (DateTime)(values[1]);

        // if the user has a good rating (10+) and has been a member for more than a year, special features are available
        return _hasGoodRating(rating) && _isLongTimeMember(date);
    }

И вот схема использования этого в XAML:

<ComboBox.IsEnabled>
    <MultiBinding Converter="{StaticResource specialFeaturesConverter}">
    <Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/>
    <Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/>
    </MultiBinding>
</ComboBox.IsEnabled>

Код выполняется нормально, но конструктор XAML не загружается с сообщением "Указанное приведение недопустимо". ошибка.Я попробовал пару способов не использовать приведение, один из которых я оставил без комментариев в приведенном выше коде.Самое смешное, что готовое лабораторное упражнение, предоставленное MS, также содержит ошибку.

Кто-нибудь знает, как это исправить, чтобы дизайнер был доволен?

Ваше здоровье,
Беррил

Это было полезно?

Решение

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

Когда вы открываете designer, Application.Current не будет вашим классом "App" (или как вы его там называете).Таким образом, там нет свойства CurrentUser , и вы получаете эту ошибку.

Есть несколько способов это исправить.Самый простой - проверить, находитесь ли вы в режиме разработки:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
  if (Application.Current == null ||
      Application.Current.GetType() != typeof(App))
  {
    // We are in design mode, provide some dummy data
    return false;
  }

  var rating = (int)(values[0]);
  var date = (DateTime)(values[1]);

  // if the user has a good rating (10+) and has been a member for more than a year, special features are available
  return _hasGoodRating(rating) && _isLongTimeMember(date);
}

Другим подходом было бы не использовать Application.Current в качестве источника для вашей привязки.

Надеюсь, это поможет :).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top