小智 73
.NET 4.0带来了一个挑战答案的新功能.
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
Run Code Online (Sandbox Code Playgroud)
Mik*_*bel 27
我知道我在这里参加派对已经迟到了,但由于没有人真正解决WPF的惯例,我以为我会参与其中.
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>
Run Code Online (Sandbox Code Playgroud)
假设 Person 是
public class Person
{
public Person(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,您无法绑定ConstructorParameters. 在此处查看一些解决方法。