使用WPF时,我注意到将控件添加到XAML文件时会调用默认构造函数。
有没有一种方法可以调用参数化的构造函数?
Answers:
.NET 4.0带来了一个新功能,该功能对答案提出了挑战-但显然仅适用于UWP应用程序(而非WPF)。
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
x
名称空间定义为什么?
XAML友好对象的指导原则之一是,它们应完全可与默认构造函数一起使用,即,不存在仅当使用非默认构造函数时才可访问的行为。为了符合XAML的声明性质,可以通过属性设置器指定对象参数。还有一个约定说,在XAML中设置属性的顺序不重要。
但是,您可能需要考虑一些特殊的注意事项,这些注意事项对于您的实现很重要,但与约定不符:
StreamSource
和都没有意义UriSource
。为了更轻松地处理这些情况,ISupportInitialize
提供了接口。从XAML读取和创建对象(即已解析)时,ISupportInitialize
将特别处理实现对象:
BeginInit()
将被称为。EndInit()
叫做。通过跟踪对BeginInit()
和的调用EndInit()
,您可以处理需要施加的任何规则,包括设置某些属性的要求。这就是处理创建参数的方式。不需要构造函数参数。
请注意,ISupportInitializeNotification
还提供了,通过添加IsInitialized
属性和Initialized
事件扩展了上述接口。我建议使用扩展版本。
是的,您可以在旁进行操作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>
假设该人是
public class Person
{
public Person(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
}
不幸的是,您不能绑定ConstructorParameters
。在此处查看一些解决方法。