WPF Converter转换导致Visual Studio设计器exception

如下所示的转换器将导致2008 Visual Studio设计器不显示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,以便设计师不会抛出适合的东西?

我认为可能会发生这种情况,因为在某些时候,使用错误的参数调用转换器。 您可以按照以下步骤调试设计器中的转换器调用:

  • 启动Visual Studio的新实例
  • 附加到第一个VS实例(工具 – >附加到进程)
  • 打开转换器源文件
  • 在Convert方法中放置一个断点
  • 在第一个VS实例中重新加载WPF设计器

这样你就应该能够检查传递给转换器的参数

我认为设计人员正在第一个例子中处理转换器,因为值[0]和值[1]为空,所以无法进行转换。 如果您检查null,那么这应该解决问题。 第二个示例基本上是在使用“is”关键字时检查null。