WPF,在XAML类中使用参数调用方法

时间:2010-08-03 15:56:56

标签: c# wpf xaml stack-overflow objectdataprovider

我的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

1 个答案:

答案 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");
}