我想仅将依赖属性附加到特定控件。
如果只是一种类型,我可以这样做:
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
的选择?
(注意:在我的特定情况下,我需要TextBox
和ComboBox
)
答案 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.");
}
}