我想只附加一个依赖属性到特定的控件.
如果只是一种类型,我可以这样做:
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中的控制类型)
但是现在我想允许该属性附加在不同类型的控件上.
您将尝试为这两种新方法添加一个重载,但由于“未知构建错误,发现不明确匹配”,无法编译.
那么我该如何限制我的DependencyProperty到一个选择的控件?
(注意:在我的具体情况下,我需要它为TextBox和ComboBox)
解决方法
Ambiguous match found.
…通常由GetMethod
抛出,如果有多个重载,并且没有指定类型签名(MSDN:找到多个指定名称的方法).基本上WPF引擎只是寻找一种这样的方法.
为什么不检查方法体中的类型并抛出InvalidOperationException(如果不允许)
请注意,这些CLR-Wrappers不应该在设置旁边包含任何代码,如果在XAML中设置了属性,则会忽略它们,尝试在设置器中抛出异常,如果只使用XAML设置,则不会出现价值.
改用回调:
public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached ( "MyProperty",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."); } }