2011-07-29 20 views
10

Quiero adjuntar una propiedad de dependencia únicamente a controles específicos.Limitar propiedad de dependencia adjunta en wpf

Si ese es sólo un tipo, no puedo hacer esto:

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

(Así: limitar el tipo Control en las get/set-Métodos)

Pero ahora quiero para permitir esa propiedad para conectarse a un tipo diferente de Control, también.
Intentaría agregar una sobrecarga para ambos métodos con ese nuevo tipo, pero eso no se puede compilar debido a un "Error de construcción desconocido, se encontró una coincidencia ambigua".

Entonces, ¿cómo puedo limitar mi DependencyProperty a una selección de Control s?
(Nota: En mi caso concreto lo necesito para TextBox y ComboBox)

+0

para aclarar que obtener el error si tiene dos métodos 'SetMyProperty (control de cuadro de texto, el valor del objeto)' y SetMyProperty (control ComboBox, el valor del objeto) ''? Si es así, puede ser una limitación del sistema de propiedad adjunto. Si es así, no puede haber otra forma de evitarlo que unirse a la clase base común más grande y lanzar una excepción cuando está conectado a un tipo de control no compatible ... – Will

+0

@ Will - sí, eso es lo que intenté = (Eso Sería malo, así que tengo que primero _ "permitir" _ para todos los 'Control's ... – ordag

Respuesta

6

concordancia ambigua encontró.

... normalmente se arrojados por GetMethod si hay varias sobrecargas y ningún tipo de firma se ha especificado (MSDN: More than one method is found with the specified name.). Básicamente, el motor WPF solo busca uno de esos métodos.

¿Por qué no verifica el tipo en el cuerpo del método y arroja un InvalidOperationException si no está permitido?


Nota sin embargo, que los CLR-envolturas no debe incluir cualquier código junto al establecer y obtener, si la estructura está situada en XAML que se tendrán en cuenta, intente lanzar una excepción en la incubadora, se no aparecerá si solo usa XAML para establecer el valor.

Utilice una llamada de retorno:

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

Lanzar una excepción es una forma posible de aplicar esto, pero perdería el soporte de autocompletar del editor (en VS) , porque todavía se muestra para cada control en ese caso. – ordag

+0

* Seguro * que se llama a 'MyPropertyChanged' cuando el sistema de propiedades de dependencia anula el enlace en XAML? DP getters/setters (regular, no adjunto). también es cierto para los DP adjuntos, deberá lanzar cada vez que actúe sobre las propiedades adjuntas. – Will

+2

@Will: se llamará a la devolución de llamada en todos los cambios, ya sea a través de enlace, configuración en XAML o llamando al método de Conjunto. –

Cuestiones relacionadas