约束来限制附加依赖属性的范围

问题描述:

有没有办法将约束添加到附加的依赖属性,以便它只能应用于元数据中的特定类型?约束来限制附加依赖属性的范围

如果不是,显式键入所连接DP的静态获取和设置方法是否有意义?

例子:

如果我有例如下面的声明:

public static int GetAttachedInt(DependencyObject obj) { 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(DependencyObject obj, int value) { 
    obj.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

会是meaningfull如下改变它,只能将其应用到文本框?

public static int GetAttachedInt(TextBox textBox) { 
    return (int)textBox.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(TextBox textBox, int value) { 
    textBox.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

我的问题是,因为这导致了不一致,因为的GetValue和的SetValue可再用于任何类型以及在标记是没有可能限制attachement。

我之前做过的事情是,我在PropertyChanged处理程序中添加了一个异常,并在那里引发了一个只允许类型xy的异常。

您认为如何?

+0

好问题...希望我的新答案可以解决它。 – Noldorin 2010-07-20 07:41:56

+2

对于元数据,我希望得到另一个答案,但我也没有看到任何东西。对于访问方法的声明,我认为它是一个政策问题。如果这样做是常识,我会做。但对我来说,它有点像用大锁关上阳台,但让大门解锁。但至少set和get方法显示了附加dp的目的。 我将使用您的建议,但继续检查PropertyChanged处理程序中的目标类型。因此,如果用户尝试在错误的控件上使用DP,用户将会在设计器中收到异常。 – HCL 2010-07-20 08:16:54

我相信所有你需要做的,以限制目标类型的附加属性是改变GetPropertyNameSetPropertyName方法的定义。

实施例:

public static int GetAttachedInt(MyTargetType obj) 
{ 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(MyTargetType obj, int value) 
{ 
    obj.SetValue(AttachedIntProperty, value); 
} 

其中MyTargetType可以是任何类型从DependencyObject继承。

+2

好吧,不是那么错误......我尝试使用Visual Studio 2013,并且如果您尝试将该属性附加到其他内容,则会出现以下错误:**附加属性“AttachedInt”只能应用于派生自“TextBox”。** – 2013-12-05 12:11:45

+0

Benoit是对的。在VS2013中,XAML intellisense将阻止您将其附加到不受支持的元素。我不使用ReSharper。 – 2015-07-31 06:14:49