Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF,使用XAML'中的参数调用方法;s级_C#_Wpf_Xaml_Stack Overflow_Objectdataprovider - Fatal编程技术网

C# WPF,使用XAML'中的参数调用方法;s级

C# WPF,使用XAML'中的参数调用方法;s级,c#,wpf,xaml,stack-overflow,objectdataprovider,C#,Wpf,Xaml,Stack Overflow,Objectdataprovider,我的XAML中有一个ObjectDataProvider,它引用了我的窗口中的一个方法。也就是说,我有NewForm.xaml.cs类NewForm,并且NewForm.xaml中的ObjectDataProvider引用了NewForm中的方法。目前,使用以下XAML,我得到了一个堆栈溢出错误,因为NewForm构造函数不断地被调用: <Window x:Class="MyNamespace.NewForm" ...> <Window.Resources> <Ob

我的XAML中有一个
ObjectDataProvider
,它引用了我的
窗口中的一个方法。也就是说,我有
NewForm.xaml.cs
NewForm
,并且
NewForm.xaml
中的
ObjectDataProvider
引用了
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>

-1
我猜这是因为
ObjectType
被设置为
NewForm
,所以它加载
NewForm
来加载我的应用程序,但是它必须创建
NewForm
的新实例才能调用
GetTeamName
,但是构造函数调用
InitializeComponent
,这将创建一个新的
NewForm
,它必须创建一个新的
NewForm
来调用
GetTeamName
。。。它实际上每次都会使VisualStudio2010崩溃


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

这里的问题根源在于
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");
}