Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Converter casting causes Visual Studio designer exception

A converter such as what follows will cause the 2008 visual studio designer to not display the xaml, and error out with a "Specified cast is not valid." exception.

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

Changing the cast to use a method such as this fixes the issue:

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

My question is, wtf is wrong with the Visual Studio designer? And, is there a better way to cast these objects to their corresponding Enum in such a way that the designer doesn't throw a fit?

like image 405
Eric Dahlvang Avatar asked Jan 08 '10 20:01

Eric Dahlvang


1 Answers

I think it might happen because at some point, the converter is called with bad arguments. You can debug the call the converter in the designer by following these steps :

  • start a new instance of Visual Studio
  • attach to the first VS instance (Tools -> Attach to process)
  • open the converter source file
  • put a breakpoint in the Convert method
  • reload the WPF designer in the first VS instance

That way you should be able to examine the arguments passed to the converter

like image 178
Thomas Levesque Avatar answered Nov 15 '22 09:11

Thomas Levesque