我有一个非常简单的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错误?
答案 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">