3

我正在设计一个用户控件,我想让它的行为可配置 - 但只有一次,当它被创建时。我以后不需要它来适应,因为我事先知道特定窗口将使用特定配置来使用它。

考虑这个简单的标记:

<MyControl SomeProperty="True" SomeOtherProperty="12345" />

SomeProperty并且SomeOtherProperty是在我的代码隐藏中声明的 DependencyProperties。

InitializeComponent()问题是:在调用之前,控件在其构造函数中对其输入数据进行了一些预处理。在那个阶段,我无权访问SomePropertySomeOtherProperty由用户定义 - 他们仍然具有默认值。

之后,如果在 XAML 中设置了这些属性,则会在构造函数之后为它们分配值。我可以通过引入 a 来响应它们,PropertyChangedCallback并在每个属性更新后再次执行计算。

这是次优的,因为我只想传递一次值并确保控件的初始化逻辑也只运行一次 - 已经使用正确的设置。s的解决方案PropertyChangedCallback要求我使这个控件更复杂,即在控件的整个生命周期内对这些依赖属性的任何更改做出响应。这比我需要的要多得多——如果我的属性是只读的并且在控件创建时只设置一次就可以了。

如何在保持 XAML 标记干净的同时做到这一点?

4

1 回答 1

2

必须构造您的控件以便 WPF 设置属性 - 没有办法将构造“延迟”到设置属性之后。

与其将初始化逻辑放在构造函数中,不如尝试将其放在其他地方,例如订阅Loaded 事件并在那里初始化。这将在设置属性后发生。

于 2012-07-30T16:00:42.073 回答