我的XAML中有一个ObjectDataProvider
引用了我Window
- 派生类中的方法。也就是说,我NewForm.xaml.cs
的课程为NewForm
,而ObjectDataProvider
中的NewForm.xaml
正在引用NewForm
中的某个方法。目前,使用以下XAML,我收到堆栈溢出错误,因为NewForm
构造函数不断被反复调用:
<Window x:Class="MyNamespace.NewForm" ...>
<Window.Resources>
<ObjectDataProvider x:Key="getTeamName"
ObjectType="{x:Type local:NewForm}"
MethodName="GetTeamName">
<ObjectDataProvider.MethodParameters>
<sys:Int32>-1</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
</Window>
我猜这是因为ObjectType
设置为NewForm
,因此加载NewForm
来加载我的应用程序,但是它必须创建{{1}的新实例为了调用NewForm
,构造函数会调用GetTeamName
来创建一个新的InitializeComponent
,它必须创建一个新的NewForm
来调用NewForm
。它实际上每次都会崩溃Visual Studio 2010。
无论如何,我要问的是我必须定义我的XAML在其他类中通过GetTeamName
调用的方法吗?或者我可以以某种方式将ObjectDataProvider
与我的XAML类中定义的方法一起使用?或者在我的XAML类中调用一个方法,我应该使用除ObjectDataProvider
之外的其他一些XAML吗?我似乎不能将我的C#方法放在另一个类中,因为它使用ObjectDataProvider
从我的XAML中获取TryFindResource
。
答案 0 :(得分:1)
问题的根源在于ObjectDataProvider
总是为它创建的任何对象创建一个新实例。所以,是的,它将创建一个NewForm
类的实例,其构造函数将实例化另一个创建ObjectDataProvider
类实例的NewForm
,然后它就是乌龟一直向下。< / p>
但问题是,ObjectDataProvider
实际上只是一种在XAML中声明创建对象并在其上调用方法的方法,因此您不必在代码隐藏中执行此操作。由于您已经在代码隐藏中创建了对象,因此避免代码隐藏不会使您受益。因此,只需创建对象的方法也将其添加到窗口的资源字典中:
// this method no longer needs to return anything, so you can change its signature
private void GetTeamName()
{
// code that creates the object goes here.
// and now, instead of "return myObject", do this:
Resources.Add("getTeamOName");
}