我正在设计一个用户控件,我想让它的行为可配置 - 但只有一次,当它被创建时。我以后不需要它适应,因为我事先知道特定窗口将使用特定配置。
考虑这个简单的标记:
<MyControl SomeProperty="True" SomeOtherProperty="12345" />
SomeProperty
和SomeOtherProperty
是我的代码隐藏中声明的DependencyProperties。
问题是:在调用InitializeComponent()
之前,控件在其构造函数中对其输入数据进行一些预处理。在该阶段,我无权访问用户定义的SomeProperty
或SomeOtherProperty
- 他们仍然拥有默认值。
之后,如果在XAML中设置了这些属性,则在构造函数之后为它们分配值。我可以通过引入PropertyChangedCallback
并在每个属性更新后再次执行计算来回复它们。
这是次优的,因为我只想传递值一次,并确保控件的初始化逻辑也只运行一次 - 已经有正确的设置。使用PropertyChangedCallback
的解决方案要求我使此控件更复杂,即在控件的整个生命周期内响应对这些依赖项属性的任何更改。这比我需要的要多得多 - 我的属性只能是只读的,并且只能在控件创建时设置一次。
如何在保持XAML标记清洁的同时设法做到这一点?
答案 0 :(得分:2)
必须构建您的控件以便WPF设置属性 - 在设置属性之前无法“延迟”构造。
您可能希望尝试将其放在其他位置,例如订阅Loaded event并在那里初始化,而不是将初始化逻辑放在构造函数中。这将在设置属性后发生。