Преобразование WPF вызывает исключение конструктора Visual Studio - PullRequest
5 голосов
/ 08 января 2010

Преобразователь, такой как приведенный ниже, приведет к тому, что дизайнер Visual Studio 2008 не будет отображать xaml, и ошибка с «Указанным приведением неверна». исключение.

public class ItemsVisibilityToGridColumnWidthConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        //THE TWO OFFENDING LINES...
        var itemsVisibility = (Visibility)values[0];
        var orientation = (Orientation)values[1];

        if (orientation == Orientation.Horizontal && itemsVisibility != Visibility.Visible)
        {
            return new GridLength(0);
        }

        return new GridLength(4, GridUnitType.Star);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Изменение приведения на использование такого метода, как этот, устраняет проблему:

static class EnumCaster
{
    internal static Orientation CastAsOrientation(object value)
    {
        if (value is Enum)
        {
            return (Orientation)value;
        }
        return Orientation.Horizontal;
    }
    internal static Visibility CastAsVisibility(object value)
    {
        if (value is Enum)
        {
            return (Visibility)value;
        }
        return Visibility.Visible;
    }
}

У меня вопрос, что WTF не так с дизайнером Visual Studio? И есть ли лучший способ привести эти объекты к соответствующим им Enum таким образом, чтобы дизайнер не бросил аппетит?

Ответы [ 2 ]

18 голосов
/ 09 января 2010

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

  • запустить новый экземпляр Visual Studio
  • прикрепить к первому экземпляру VS (Инструменты -> Присоединить к процессу)
  • открыть исходный файл конвертера
  • поставить точку останова в методе Convert
  • перезагрузить конструктор WPF в первом экземпляре VS

Таким образом, вы сможете проверить аргументы, передаваемые преобразователю

3 голосов
/ 09 января 2010

Я думаю, что дизайнер обрабатывает конвертер в первом примере и не может выполнить приведение, потому что значения [0] и значения [1] равны нулю. Если вы делаете проверки на ноль, то это должно решить проблему. Второй пример, по сути, проверяет наличие нуля, используя ключевое слово "is".

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