在使用WPF时,我注意到当我向XAML文件添加控件时,会调用默认构造函数。
有没有办法调用参数化构造函数?
答案 0 :(得分:71)
.NET 4.0带来了一个挑战答案的新功能。
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
答案 1 :(得分:26)
我意识到我在这里参加派对已经迟到了,但由于没有人真正解决过WPF的惯例,我以为我会参与其中。
XAML友好对象的一个指导原则是它们应该完全可以使用默认构造函数,即,没有只有在使用非默认构造函数时才能访问的行为。为了适应XAML的声明性质,通过属性设置器指定对象参数。还有一个约定规定,在XAML中设置属性的顺序不应该很重要。
但是,您可能会有一些特殊注意事项对您的实施很重要,但与惯例不一致:
StreamSource
和UriSource
是没有意义的。为了更容易处理这些情况,提供了ISupportInitialize
接口。当从XAML读取和创建对象(即解析)时,将专门处理实现ISupportInitialize
的对象:
BeginInit()
将被调用。EndInit()
被召唤。通过跟踪对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。