2012-07-30 64 views
3

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

考虑这个简单的标记:

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

SomePropertySomeOtherProperty在我隐藏声明DependencyProperties。

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

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

这是次优的,因为我只是想通过值一次并确保控件的初始化逻辑只运行一次 - 已经具有正确的设置。具有PropertyChangedCallback的解决方案需要我使得该控制更复杂,即响应于在控制的整个生命周期期间对这些依赖属性的任何更改。这比我需要的要多得多 - 我的属性在控件创建时只能读取一次,并且只设置一次,这会令人满意。

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

回答

2

为了让WPF设置属性,必须构建您的控件 - 在设置属性之后,无法“延迟”构造。

除了在构造函数中放入初始化逻辑外,您可能还想尝试将它放在其他位置,例如订阅Loaded event并在那里初始化。这会在设置属性后发生。

+0

谢谢!有没有办法让我清楚地指出这些属性只能在初始化时设置,就像从常规对象的构造函数参数中设置'readonly'字段一样?我看过'FrameworkPropertyMetadata.IsNotDataBindable',但这可能是不够的。 – Kos 2012-07-31 18:13:24

+0

@Kos不是真的,因为你在“初始化”之后设置它们(技术上)。这就是说,你不需要让它们的值在设置后真正改变。如果整个对象以这种方式工作,则可以让您的类从Freezable派生,并“冻结”它(请参阅:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx) – 2012-07-31 18:22:53