2010-01-08 69 views
4

如下所示的转换器将导致2008 visual studio designer不显示xaml,并且出现“指定的转换无效”错误。例外。WPF Converter转换器导致Visual Studio设计器异常

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

我的问题是,跆拳道是错的Visual Studio的设计师?而且,是否有更好的方式将这些对象投射到相应的枚举中,以便设计者不会抛出合适的东西?

+1

“wtf与Visual Studio设计器错误吗?”我有一个列表,但这个互联网太小,不能容纳它。 – itowlson 2010-01-08 21:03:25

+0

您可以在使用此转换器的位置发布XAML吗? – 2010-01-08 21:22:11

回答

18

我想可能会发生这种情况,因为在某些时候,转换器被调用的参数很糟糕。您可以通过以下步骤调试呼叫在设计转换器:

  • 启动Visual Studio的新实例
  • 连接到第一VS实例(工具 - >附加到进程)
  • 打开转换器的源文件
  • 将断点在Convert方法
  • 重装WPF设计在第一VS实例

那方式你应该能够检查传递给转换器的参数

+2

+ 1为设计师调试转换器上的漂亮提示 – mattythomas2000 2010-01-08 21:39:50

+2

设计者发送一个DependencyProperty.UnsetValue。感谢关于调试设计者的提示。 – 2010-01-08 23:29:36

+1

从Visual Studio 2012开始,WPF设计器运行在名为XDesProc.exe的单独进程中。您应该从Visual Studio的新实例附加到此过程。 – 2013-10-31 15:54:25

3

我认为设计者正在处理第一个例子中的转换器,并且无法投射,因为值[0]和值[1]为空。如果你检查null,那么这应该可以解决问题。第二个例子主要是在使用“is”关键字时检查null。

+0

将null投射到任何东西(引用类型)不会引发异常。更可能的原因是值[0]和值[1]应该交换... – 2010-01-08 21:18:35

+3

@Aviad,枚举不是引用类型,它们是值类型...将null值转换为值类型抛出NullReferenceException – 2010-01-08 21:27:49

相关问题