为什么WPF转换器显示蓝色的花体?

时间:2018-12-21 04:12:40

标签: c# wpf

我有一个非常简单的WPF转换器:

internal class FlatTreeMarginConverter : IValueConverter
{
    #region Fields

    private static readonly Thickness _emptyThickness = new Thickness(0, 0, 0, 0);

    #endregion

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        FlatTreeViewItem tvi = value as FlatTreeViewItem;

        if (tvi == null)
            return _emptyThickness;

        int nLevel = -1;

        while (tvi != null)
        {
            tvi = tvi.GetVisualAncestor<FlatTreeViewItem>();
            nLevel++;
        }

        return new Thickness(19 * nLevel, 0, 0, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

由于某种原因,Xaml中的声明下有一个蓝色的花体,但有一个例外:“对象引用未设置为实例”。声明看起来像:

我不明白...我代码中的所有内容都是安全的。有任何想法吗?还是只是一些随机的VS错误?

2 个答案:

答案 0 :(得分:1)

我看不到“对象引用未设置为实例”的位置。可能来自您显示的代码。因此它必须来自其他地方...

有一个不错的技巧可以调试和了解“对象引用未设置为实例”的位置。来自。

您可以使用“附加到进程”(并选择devenv.exe)将一个Visual Studio实例附加到当前的Visual Studio实例。
看看Attach debugger onto another Visual Studio instance
做完“附加到处理”后,别忘了在DEBUG / Exeptions中为所有异常打勾“ Thrown”

完成后,打开Xaml文件。
异常“对象引用未设置为实例”。会被Visual Studio的其他实例抛出并捕获,从而使您能够看到它的来源。 允许您调试代码。

答案 1 :(得分:0)

内部类中有公共方法。使班级公开,清洁和重建。公共方法/属性在内部类中降级为内部。

无论使用什么处理xaml都不是完全可靠的,看到像这样的伪造的蓝色弯曲是很常见的。
它使用反射来检查转换器等是否在exe中。这就是为什么您需要在转换器丢失弯曲之前进行编译的原因。据我了解,这意味着转换器应该是公开的。

除非明确清理,否则VS坚持旧的东西定义也很普遍。

一旦您更改为公共清洁并重建...它旋转起来好吗?

顺便说一句 我还建议使用markupextension方法,该方法可让您使用转换器,而无需将其作为xaml中的资源。

例如:

public class IsOfTypeConverter : MarkupExtension, IValueConverter
{
    public Type TypeToCompare { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.GetType() == TypeToCompare;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

可以使用:

   <DataTrigger Binding="{Binding ., Converter={ui:IsOfTypeConverter TypeToCompare={x:Type ui:PlaceVM}}}" Value="True">