问题 约束以限制附加依赖项属性的范围


有没有办法向附加的依赖项属性添加约束,以便它只能应用于元数据中的特定类型?

如果没有,显式键入附加DP的静态Get-and Set-methods是否有意义?

例:

如果我有以下声明:

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));

如下更改它是否有意义,只将其应用于TextBoxes?

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可以再用于任何类型,并且在标记中也不可能限制附件。

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

你怎么看?


10410
2017-07-19 09:11


起源

好问题......希望我的新答案能解决它。 - Noldorin
对于元数据,我希望得到另一个答案,但我也没有看到任何答案。对于访问方法的声明,我认为这是一个政策问题。如果像这样做是常识,我会这样做。但对我来说,它有点像关闭带有大锁的阳台但是让大门解锁。但至少set-and get方法显示了附加dp的目的。我将使用您的建议,但继续检查PropertyChanged-handler中的目标类型。因此,如果用户尝试在错误的控件上使用DP,则会在设计器中收到异常。 - HCL


答案:


我相信,为了限制附加属性的目标类型,您需要做的就是更改定义 GetPropertyName 和 SetPropertyName 方法。

例:

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


15
2017-07-19 09:31



好吧,没那么错......我尝试使用Visual Studio 2013,如果您尝试将该属性附加到其他内容,则会出现以下错误: 附加属性“AttachedInt”只能应用于从“TextBox”派生的类型。 - Benoit Blanchon
Benoit是对的。在VS2013中,XAML intellisense将阻止您将其附加到不受支持的元素。我不使用ReSharper。 - Bruce Pierson