0

我的ObjectDataProviderXAML 中有一个引用我的Window- 派生类中的方法。也就是说,我有NewForm.xaml.csclassNewForm并且ObjectDataProviderinNewForm.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以加载我的应用程序,但是它必须创建一个新实例NewForm才能调用GetTeamName,但是构造函数调用InitializeComponent它创建一个新的NewForm,它必须创建一个新NewForm的调用GetTeamName...它实际上每次都会使 Visual Studio 2010 崩溃。

无论如何,我要问的是我是否必须ObjectDataProvider在其他类中定义我的 XAML 通过 s 调用的方法?或者我可以以某种方式使用ObjectDataProvider我的 XAML 类中定义的方法吗?或者在我的 XAML 类中调用一个方法,我应该使用其他的 XAMLObjectDataProvider吗?似乎我不能将我的 C# 方法放在另一个类中,因为它用于从我的 XAMLTryFindResource中获取一个。XmlDataProvider

4

1 回答 1

1

这里问题的根源在于,它ObjectDataProvider总是为它创建的任何对象创建一个新实例。所以是的,它将创建NewForm该类的一个实例,其构造函数将实例化另一个ObjectDataProvider创建NewForm该类实例的实例,然后它一直是海龟。

但问题是,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");
}
于 2010-08-03T18:03:28.040 回答