何时应该使用FrameworkPropertyMetadata或UIPropertyMetadata而不是普通的PropertyMetadata?

88
观察附带属性和行为的示例时,我看到了各种使用 FrameworkPropertyMetadataUIPropertyMetadataPropertyMetadata 的混杂。由于它们都构成了继承层次结构,那么我如何选择要使用哪个呢?
2个回答

90

这些类用于报告依赖属性的某些行为方面。

检查不同的类以获取它们提供的选项。

例如,

如果您只想通过dp支持属性并提供默认值,请使用PropertyMetadata

如果要指定动画行为,请使用UIPropertyMetadata

但是,如果某个属性影响WPF框架级别的东西,例如元素布局、父布局或数据绑定,请使用FrameworkPropertyMetadata

详细信息请参见msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx


2
真正的问题是,为什么propdp代码片段使用UIPropertyMetadata,特别是在Silverlight中没有PropertyMetadata子类?这让我很烦恼。 - Grank
6
这是因为WPF和Silverlight之间共享相同的代码片段。 您可以从此链接尝试使用不同的Silverlight代码片段: http://blog.nerdplusart.com/archives/silverlight-code-snippets - gp.
4
MSDN表示,“通常情况下,您应该使用 FrameworkPropertyMetadata,特别是如果您的属性与属性系统和 WPF 函数(如布局和数据绑定)有任何交互。” -(指定元数据)http://msdn.microsoft.com/en-us/library/ms751554.aspx - Wayne Bloss
FrameworkPropertyMetadata应该用于哪种数据绑定?我只想要一个与控件的IsEnabled属性绑定的属性。 - Monstieur

1
FrameworkPropertyMetadata的一个有用特性是你可以定义BindsTwoWayByDefault的行为。否则,依赖属性默认是OneWay
当你需要一个双向绑定的依赖属性时,通常你总是需要为每个绑定定义Mode=TwoWay。如果你将这个模式设置为默认值,你就不再需要为每个绑定设置它了。
你可以像这样设置这个行为:
new FrameworkPropertyMetadata(_myDefaultValue_, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)

完整示例:

public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
    "IsSelected", typeof(bool), typeof(MyClass),
    new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault);

public bool IsSelected
{
    get { return (bool)GetValue(IsSelectedProperty); }
    set { SetValue(IsSelectedProperty, value); }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接