Public vs Private AttachedProperties

时间:2011-09-20 05:51:52

标签: wpf silverlight silverlight-4.0 attached-properties attachedbehaviors

AttachedProperties作为private vs public有何意义? 通常它定义为(示例):

public static readonly DependencyProperty CommandProperty = 
DependencyProperty.RegisterAttached(
            "Command",
            typeof(ICommand),
            typeof(Click),
            new PropertyMetadata(OnSetCommandCallback));

但我也看到了一些属性为private static readonly...

的示例

如果我现在将上述CommandProperty更改为private会产生什么后果?如果我这样做,它似乎仍然可以在我的XAML intellisense中使用。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

不同之处在于您将无法从课堂外访问DependencyProperty。如果静态Get和Set方法也是私有的,那么这是有意义的,(在附加行为中你需要存储一些行为本地数据)但不是其他方式(我不认为我用公开的Get and Set看过这个。

您想要使用DependencyProperty的示例是DependencyPropertyDescriptor。使用公开DependencyProperty,您可以执行以下操作

DependencyPropertyDescriptor de =
    DependencyPropertyDescriptor.FromProperty(Click.CommandProperty, typeof(Button));

de.AddValueChanged(button1, delegate(object sender, EventArgs e)
{
    // Some logic..
});

但如果DependencyProperty是私有的,则上述代码将无效。

但是,以下内容适用于公共和私有DependencyProperty (如果静态Get和Set方法是公共的),因为所有者类可以访问私有{{1 }}。这也适用于通过Xaml设置的绑定和值,其中直接调用DependencyPropertyGetValue

SetValue

如果您查看框架,您会注意到所有公开附加的媒体资源都有公开Click.SetCommand(button, ApplicationCommands.Close); ICommand command = Click.GetCommand(button); ,例如DependencyPropertyGrid.RowProperty。因此,如果附加的财产是公开的,请使用公开Storyboard.TargetNameProperty