Wpf 从XAML调用参数化构造函数

Wpf 从XAML调用参数化构造函数,wpf,xaml,Wpf,Xaml,在使用WPF时,我注意到当我向XAML文件添加控件时,会调用默认构造函数 有没有一种方法可以调用参数化构造函数?没有。不是从XAML[使用WPF时]。.NET 4.0带来了一个挑战答案的新特性-但显然只适用于UWP应用程序(而不是WPF) 一个或多个对象元素 XAML友好对象的指导原则之一是,它们应该完全可用于默认构造函数,也就是说,没有只有在使用非默认构造函数时才可访问的行为。为了适应XAML的声明性质,对象参数通过属性设置器指定。还有一种约定是,在XAML中设置属性的顺序应该不重要 然而

在使用WPF时,我注意到当我向XAML文件添加控件时,会调用默认构造函数


有没有一种方法可以调用参数化构造函数?

没有。不是从XAML[使用WPF时]。

.NET 4.0带来了一个挑战答案的新特性-但显然只适用于UWP应用程序(而不是WPF)


一个或多个对象元素

XAML友好对象的指导原则之一是,它们应该完全可用于默认构造函数,也就是说,没有只有在使用非默认构造函数时才可访问的行为。为了适应XAML的声明性质,对象参数通过属性设置器指定。还有一种约定是,在XAML中设置属性的顺序应该不重要

然而,您可能有一些对您的实施很重要但与约定不符的特殊考虑:

  • 您可能有一个或多个属性,在使用对象之前必须设置这些属性
  • 两个或多个属性可能相互排斥,例如,设置图像的
    StreamSource
    UriSource
    是没有意义的
  • 您可能希望确保仅在初始化期间设置属性
  • 一个属性可能依赖于另一个,这可能很棘手,因为在设置属性时,前面提到了顺序独立的约定
  • 为便于处理这些情况,提供了
    ISupportInitialize
    界面。当从XAML读取和创建对象(即解析)时,将专门处理实现
    ISupportInitialize
    的对象:

  • 将调用默认构造函数
  • 将调用
    BeginInit()
  • 属性将按照它们在XAML声明中出现的顺序进行设置
  • 调用了
    EndInit()
  • 通过跟踪对
    BeginInit()
    EndInit()
    的调用,您可以处理需要施加的任何规则,包括设置某些属性的要求。这是处理创建参数的方式;不需要构造函数参数


    请注意,还提供了
    ISupportInitializeNotification
    ,它通过添加
    IsInitialized
    属性和
    Initialized
    事件扩展了上述接口。我建议使用扩展版本。

    是的,您可以通过
    ObjectDataProvider
    来完成。它允许您调用非默认构造函数,例如:

    假设那个人是

    公共类人物
    {
    公众人物(字符串名称)
    {
    this.Name=Name;
    }
    公共字符串名称{get;set;}
    }
    

    不幸的是,您无法绑定
    构造函数参数
    。查看一些解决方法。

    很好,我很高兴你提出了这个问题。对于来这里寻找确切答案的任何人,我将为你节省一些时间,因为你将在下一篇文章中找到:“基本上没有当前的编译器(WPF、SL、WinRT)真正支持它”-Duncan Matheson。由Kevek的评论链接的,应该在答案中。定义的
    x
    名称空间是什么?不幸的是,此语法适用于XAML 2009版本,意味着通用应用程序,在WPF中不起作用。请看我的问题
    <object ...>
        <x:Arguments>
            oneOrMoreObjectElements
        </x:Arguments>
    </object>