我正在设计一个用户控件,我想让它的行为是可配置的 - 但只有一次,当它被创建时。我不需要它以后再适应,因为我事先知道一个特定的窗口将使用它与一个特定的配置。WPF UserControl预配置
考虑这个简单的标记:
<MyControl SomeProperty="True" SomeOtherProperty="12345" />
SomeProperty
和SomeOtherProperty
在我隐藏声明DependencyProperties。
问题是:在调用InitializeComponent()
之前,控件会在其构造函数中对其输入数据进行一些预处理。在那个阶段,我没有访问由用户定义的SomeProperty
或SomeOtherProperty
- 他们仍然有默认值。
之后,如果在XAML中设置了这些属性,则会在构造函数之后为它们分配值。我可以通过引入PropertyChangedCallback
来回应他们,并在每个属性更新后再次执行计算。
这是次优的,因为我只是想通过值一次并确保控件的初始化逻辑只运行一次 - 已经具有正确的设置。具有PropertyChangedCallback
的解决方案需要我使得该控制更复杂,即响应于在控制的整个生命周期期间对这些依赖属性的任何更改。这比我需要的要多得多 - 我的属性在控件创建时只能读取一次,并且只设置一次,这会令人满意。
如何在保持XAML标记清洁的同时做到这一点?
谢谢!有没有办法让我清楚地指出这些属性只能在初始化时设置,就像从常规对象的构造函数参数中设置'readonly'字段一样?我看过'FrameworkPropertyMetadata.IsNotDataBindable',但这可能是不够的。 – Kos 2012-07-31 18:13:24
@Kos不是真的,因为你在“初始化”之后设置它们(技术上)。这就是说,你不需要让它们的值在设置后真正改变。如果整个对象以这种方式工作,则可以让您的类从Freezable派生,并“冻结”它(请参阅:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx) – 2012-07-31 18:22:53