Ограничить прикрепленное свойство зависимостей в wpf

Я хочу привязать свойство зависимостей только к определенным элементам управления.

Если это только один тип, я могу это сделать:

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

(Итак: ограничьте тип Control в методах Get/Set-Methods)

Но теперь я хочу, чтобы это свойство было привязано к другому типу Control тоже.
Вы попытаетесь добавить перегрузку для обоих методов с этим новым типом, но это не удается скомпилировать из-за "Неизвестной ошибки сборки, найденного неоднозначного соответствия".

Итак, как я могу ограничить свой DependencyProperty выбором Control s?
(Примечание: в моем конкретном случае мне это нужно для TextBox и ComboBox)

Ответ 1

найдено неоднозначное соответствие.

... обычно выбрасывается GetMethod, если есть несколько перегрузок и не указана подпись типа (MSDN: More than one method is found with the specified name.). В принципе, WPF-движок ищет только один такой метод.

Почему бы не проверить тип в теле метода и выбросить InvalidOperationException, если это не разрешено?


Обратите внимание, однако, что те CLR-Wrappers не должны включать любой код рядом с настройкой и получением, если свойство установлено в XAML , они будут игнорироваться, попробуйте бросить исключение в установщике, оно не появится, если вы используете XAML для установки значения.

Вместо этого используйте обратный вызов:

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.");
    }
}