代码之家  ›  专栏  ›  技术社区  ›  Eric Dahlvang

WPF转换器转换导致Visual Studio设计器异常

  •  5
  • Eric Dahlvang  · 技术社区  · 15 年前

    如下所示的转换器将导致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设计器有问题吗?还有,有没有更好的方法可以将这些对象强制转换到相应的枚举中,这样设计人员就不会抛出一个fit?

    2 回复  |  直到 15 年前
        1
  •  18
  •   Thomas Levesque    15 年前

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

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

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

        2
  •  3
  •   mattythomas2000    15 年前

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