从XAML调用参数化构造函数

77

使用WPF时,我注意到将控件添加到XAML文件中时会调用默认构造函数。

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


请看一下我的问题: https://dev59.com/RXDXa4cB1Zd3GeqP_Vth - eran otzap
4个回答

75

.NET 4.0引入了一项新功能,挑战了这个答案 - 但显然仅适用于UWP应用程序(而不是WPF)。

x:Arguments指令

<object ...>
    <x:Arguments>
        oneOrMoreObjectElements
    </x:Arguments>
</object>

很好,我很高兴你提出了这个问题。 - Jeff Mercado
33
如果有其他人来到这里寻找完全相同的答案,我会为你节省一些时间,因为你接下来将会找到这篇帖子:https://dev59.com/_23Xa4cB1Zd3GeqPcj83 - Kevek
6
“基本上,目前没有任何编译器(WPF、SL、WinRT)实际支持它。”- Duncan Matheson。由Kevek的评论提供链接,应该在答案中。 - David
x 命名空间定义的是什么? - jpmc26
3
很遗憾,这个语法是针对XAML 2009版本的通用应用程序,不幸的是在WPF中无法使用。 - Amir Mahdi Nassiri

35
XAML友好对象的指导原则之一是它们应该完全可用于默认构造函数,即没有行为只能在使用非默认构造函数时才能访问。为了符合XAML的声明性质,对象参数是通过属性设置器指定的。还有一个传统约定,即在XAML中设置属性的顺序不重要。
但是,您可能需要考虑一些特殊情况,这对您的实现非常重要,但与传统相悖:
1. 您可能有一个或多个属性必须在使用对象之前设置。 2. 两个或更多属性可能彼此互斥,例如,设置图像的StreamSource和UriSource都是没有意义的。 3. 您可能希望确保属性仅在初始化期间设置。 4. 一个属性可能依赖于另一个属性,由于上述属性设置顺序独立的约定,这可能会很棘手。
为了更轻松地处理这些情况,提供了ISupportInitialize接口。当从XAML读取并创建对象(即解析)时,实现ISupportInitialize的对象将被特殊处理:
1. 将调用默认构造函数。 2. 调用BeginInit()。 3. 属性将按它们在XAML声明中出现的顺序设置。 4. 调用EndInit()。
通过跟踪对BeginInit()和EndInit()的调用,可以处理您需要执行的任何规则,包括要求设置某些属性。这就是您应该处理创建参数的方式,而不是要求构造函数参数。
请注意,还提供了ISupportInitializeNotification接口,它通过添加IsInitialized属性和Initialized事件扩展了上述接口。我建议使用扩展版本。

10

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

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

<Grid>
    <Grid.Resources>
        <ObjectDataProvider x:Key="myDataSource"
                            ObjectType="{x:Type local:Person}">
            <ObjectDataProvider.ConstructorParameters>
                <system:String>Joe</system:String>
            </ObjectDataProvider.ConstructorParameters>
        </ObjectDataProvider>
    </Grid.Resources>
    <Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label>
</Grid>
假设Person是
public class Person
{
    public Person(string Name)
    {
        this.Name = Name;
    }
    public string Name { get; set; }
}

很遗憾,你不能绑定ConstructorParameters。 在这里可以看到一些解决方法here


10
不。使用WPF时不是来自XAML。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接