问题
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