代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

WPF,用XAML类中的参数调用方法

  •  0
  • Sarah Vessels  · 技术社区  · 14 年前

    我有一个 ObjectDataProvider 在我的XAML中引用我的 Window -派生类。也就是说,我有 NewForm.xaml.cs NewForm 对象数据提供程序 NewForm.xaml 正在引用中的方法 新窗体 . 目前,对于以下XAML,我得到了一个堆栈溢出错误,因为 构造函数不断被调用:

    <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 设置为 新窗体 加载我的应用程序,但它必须创建 新窗体 为了打电话 GetTeamName InitializeComponent 创造了一个新的 必须创造一个新的 新窗体 打电话 ... 它实际上每次都会崩溃visualstudio2010。

    无论如何,我要问的是,我是否必须定义我的XAML调用的方法 对象数据提供程序 她在别的班吗?或者我可以用 使用XAML类中定义的方法?或者在我的XAML类中调用一个方法,我应该使用其他的XAML吗 对象数据提供程序 ? 似乎我不能把我的C方法放在另一个类中,因为它使用 TryFindResource 得到一个 XmlDataProvider

    1 回复  |  直到 14 年前
        1
  •  1
  •   Robert Rossney    14 年前

    问题的根源在于 ObjectDataProvider 总是为任何对象创建一个新实例。是的,它将创建 NewForm 类,其构造函数将实例化另一个 创建 新窗体 同学们,然后是海龟。

    对象数据提供程序 实际上只是在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");
    }