从XAML调用参数化构造函数

时间:2009-07-04 23:21:06

标签: wpf xaml

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

有没有办法调用参数化构造函数?

4 个答案:

答案 0 :(得分:71)

.NET 4.0带来了一个挑战答案的新功能。

x:Arguments Directive

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

答案 1 :(得分:26)

我意识到我在这里参加派对已经迟到了,但由于没有人真正解决过WPF的惯例,我以为我会参与其中。

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

但是,您可能会有一些特殊注意事项对您的实施很重要,但与惯例不一致:

  1. 在使用对象之前,您可能拥有一个或多个必须的属性。
  2. 两个或多个属性可能彼此互斥,例如,同时设置图像的StreamSourceUriSource是没有意义的。
  3. 您可能希望确保在初始化期间仅 设置属性。
  4. 一个属性可能依赖于另一个属性,由于上述设置属性时的顺序独立性约定,这可能很棘手。
  5. 为了更容易处理这些情况,提供了ISupportInitialize接口。当从XAML读取和创建对象(即解析)时,将专门处理实现ISupportInitialize的对象:

    1. 将调用默认构造函数。
    2. BeginInit()将被调用。
    3. 将按照它们在XAML声明中出现的顺序设置属性。
    4. EndInit()被召唤。
    5. 通过跟踪对BeginInit()EndInit()的调用,您可以处理需要施加的任何规则,包括设置某些属性的要求。这是你应该如何处理创建参数;不要求构造函数参数。

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

答案 2 :(得分:11)

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

答案 3 :(得分:3)

是的,你可以通过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