如何解决'对象引用未设置为对象的实例'。当使用WPF CR查看器控件

我正在WPF应用程序遵循MVVM模式。如何解决'对象引用未设置为对象的实例'。当使用WPF CR查看器控件

我有一个带有导航控件的窗口以及占位符(contentcontrol)来存放单个用户控件。主窗口的viewmodel维护一个打开的子视图模型数组,并具有一个'CurrentView'属性,该属性指向数组中的单个子视图模型。此'CurrentView'属性然后绑定到主窗口上的contentcontrol占位符。视图模型都通过数据模板设置了特定的视图(用户控件)。

当'CurrentView'属性设置为其中一个子视图模型时,相应的用户控件视图显示在主窗口的contentcontrol占位符中。一次只显示一个孩子viewmodel,其余的只是坐在数组中,等待通过设置为CurrentView属性显示。

到现在为止,我对这种模式没有任何问题。它完美适用于所有标准的WPF控件,没有任何问题。我的问题是只有当我的用户控件中的一个托管WPF Crystal Report Viewer时。

我可以将当​​前视图设置为具有水晶报告reportdocument的viewmodel。我加载报告文档并将其公开为公共依赖属性。此视图模型的数据模板用户控件具有WPF Crystal Report Viewer控件。我已将附加属性添加到报表查看器控件,以允许绑定到.ViewerCore.ReportSource。我将视图模型中的报告文档绑定到附属的属性上,瞧!所有这些按预期工作。我编译我的程序并导航到水晶报表查看器...它加载绑定的报告并正确显示它。

但是,现在,当我离开时(用不同的viewmodel替换主窗口上的'CurrentView'属性),我得到一个错误。

起初,我得到了“Property not set:Window”。经过一番搜索之后,我发现Crystal Report Viewer试图显示一个消息框,但没有意识到它是所有者窗口,所以它不能。为了解决这个问题,我将Crystal Reports查看器的所有者设置为用户控件加载事件的主窗口。这摆脱了“属性未设置:窗口”错误。

我重新编译,导航到报告,它加载正常。我离开了,我现在得到一个弹出窗口,说'对象引用没有设置为对象的实例。'我点击好,弹出消失,我的程序继续,没有任何明显的问题。我可以导航回到报告没有任何问题,但是这个弹出窗口显示了每次我离开的时候。

我无法调试弹出窗口的源,因为如果我删除了窗口所有者,它就会被查看者无法找到所有者显示错误

对不起,这个项目是非常大的,所以如果你想查看代码的任何特定部分,只需要离开评论,我会更新我的问题。

回答:

我试了一堆不同的断点,并能够缩小到我附加的依赖属性绑定到ViewerCore.ReportSource。当我改变到不同的视图时,这个属性意外地被设置为null,并且附加的属性没有考虑到这一点。如果将来有人有类似的问题,您可以使用以下内容:

public static class DependencyPropertyHost 

{

public static readonly DependencyProperty ReportSourceProperty = DependencyProperty.RegisterAttached("ReportSource", typeof(ReportDocument), typeof(DependencyPropertyHost), new PropertyMetadata(ReportSourceChanged));

public static ReportDocument GetReportSource(DependencyObject obj)

{

return obj.GetValue(ReportSourceProperty) as ReportDocument;

}

public static void SetReportSource(DependencyObject obj, ReportDocument value)

{

obj.SetValue(ReportSourceProperty, value);

}

private static void ReportSourceChanged(object sender, DependencyPropertyChangedEventArgs args)

{

var viewer = sender as CrystalReportsViewer;

if (viewer != null && args.NewValue != null)

{

viewer.ViewerCore.ReportSource = args.NewValue;

}

}

}

以上是 如何解决'对象引用未设置为对象的实例'。当使用WPF CR查看器控件 的全部内容, 来源链接: utcz.com/qa/258924.html

回到顶部