在wpf中限制附加的依赖项属性

时间:2011-07-29 14:09:43

标签: c# .net wpf dependency-properties

我想仅将依赖属性附加到特定控件。

如果只是一种类型,我可以这样做:

public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached("MyProperty", typeof(object), typeof(ThisStaticWrapperClass));

public static object GetMyProperty(MyControl control)
{
    if (control == null) { throw new ArgumentNullException("control"); }

    return control.GetValue(MyPropertyProperty);
}

public static void SetMyProperty(MyControl control, object value)
{
    if (control == null) { throw new ArgumentNullException("control"); }

    control.SetValue(MyPropertyProperty, value);
}

(所以:限制Get / Set-Methods中的Control类型)

但现在我想允许该属性附加在不同类型的Control上 您尝试使用该新类型为这两个方法添加重载,但由于“未知的构建错误,找到了模糊匹配”而无法编译。

那么我怎样才能将DependencyProperty限制为Control的选择? (注意:在我的特定情况下,我需要TextBoxComboBox

1 个答案:

答案 0 :(得分:7)

  

找到了模糊的匹配。

如果有多个重载并且未指定类型签名(MSDN:More than one method is found with the specified name.),则

...通常由GetMethod抛出。基本上WPF引擎只是在寻找一种这样的方法。

为什么不检查方法体中的类型,如果不允许,则抛出InvalidOperationException


但是请注意,那些CLR-Wrappers不应该在设置和获取旁边包含任何代码,如果在XAML中设置了属性它们将被忽略,请尝试抛出如果你只使用XAML来设置值,那么在setter中就不会出现异常。

改为使用回调:

public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.RegisterAttached
        (
            "MyProperty",
            typeof(object),
            typeof(ThisStaticWrapperClass),
            new UIPropertyMetadata(null, MyPropertyChanged) // <- This
        );

public static void MyPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    if (o is TextBox == false && o is ComboBox == false)
    {
        throw new InvalidOperationException("This property may only be set on TextBoxes and ComboBoxes.");
    }
}