WPF Converter casting causes Visual Studio designer exception

两盒软妹~` 提交于 2019-12-18 16:55:30

问题


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?


回答1:


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




回答2:


I think the designer is processing the converter in the first example and is unable to cast because values[0] and values[1] are null. If you do checks for null then this should resolve the problem. The second example is essentially checking for null whilst using the "is" keyword.



来源:https://stackoverflow.com/questions/2030651/wpf-converter-casting-causes-visual-studio-designer-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!