了解 XAML 中是不是未设置 DependencyProperty
Posted
技术标签:
【中文标题】了解 XAML 中是不是未设置 DependencyProperty【英文标题】:Knowing if a DependencyProperty has not been set in XAML了解 XAML 中是否未设置 DependencyProperty 【发布时间】:2013-11-16 20:45:38 【问题描述】:我有一个控件,它公开了一个名为 PlacementTarget 的 DP(它绑定到一个子 Popup FWIW)。
我想要做的是,如果 PlacementTarget 未在 XAML 中设置,那么(控件将)将其设置为控件所在的窗口。当我说“未设置”时,我的意思不仅仅是“为空” (这允许用户 dev 将 PlacementTarget 设置为 null,并且控件不会自动将其设置为 Window)。
我有一个名为 placementTargetIsSet 的字段,我在 Change 事件处理程序中将其设置为 true
public readonly static DependencyProperty PlacementTargetProperty =
DependencyProperty.Register(
"PlacementTarget", typeof(UIElement), typeof(MyControl),
new PropertyMetadata(new PropertyChangedCallback(PlacementTargetChanged)));
static void PlacementTargetChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
MyControl ctrl = (sender as MyControl);
ctrl.placementTargetIsSet = true;
public UIElement PlacementTarget
get return (UIElement)GetValue(PlacementTargetProperty);
set SetValue(PlacementTargetProperty, value);
但是,我发现更改的事件发生在 OnApplyTemplate 和 Loaded 事件之后。即当 OnApplyTemplate 或 Loaded 发生时,placementTargetIsSet==false,无论 PlacementTarget 是否已设置(在 XAML 中)。
那么我什么时候可以安全地假设 PlacementTarget 尚未设置?
【问题讨论】:
【参考方案1】:您不需要额外的 placementTargetIsSet
字段,因此不需要 PropertyChangedCallback。
为了确定是否为PlacementTarget
属性设置了值,您只需调用ReadLocalValue 方法并测试它是否返回DependencyProperty.UnsetValue:
bool placementTargetIsSet =
ReadLocalValue(PlacementTargetProperty) != DependencyProperty.UnsetValue;
【讨论】:
我迟到了,但我不能感谢你的回答。它刚刚解决了我一年左右的一个问题,它使用一个帮助类来设置网格中所有元素的属性。 哇... 在 WPF 中工作了好几年。从来不知道这种方法存在。 如果您有一个具有自定义样式的控件,则 不起作用。我所有的属性都是Unset
,即使是那些有绑定的..
@DominicJonas 它不应该与样式设置器中的值一起使用,因为它们不是 local 值。
@Clemens 啊,那我理解错了。是否也可以知道它是否设置在xaml
中?否则我必须选择带有 propChanged 和 bool 标志的解决方法。以上是关于了解 XAML 中是不是未设置 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章
如何在设计时避免 XAML 代码中的“对象引用未设置为对象的实例”异常?