2011-11-11 15 views
9

Estoy escribiendo una biblioteca de control. En esta biblioteca hay algunos paneles personalizados que se rellenan con UIElements del usuario. Puesto que cada elemento secundario en mi lib debe tener una propiedad "Título", me escribió lo siguiente:No se puede vincular una propiedad adjunta a otra propiedad de dependencia

// Attached properties common to every UIElement 
public static class MyLibCommonProperties 
{ 
    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.RegisterAttached( 
      "Title", 
      typeof(String), 
      typeof(UIElement), 
      new FrameworkPropertyMetadata(
       "NoTitle", new PropertyChangedCallback(OnTitleChanged)) 
      ); 

    public static string GetTitle(UIElement _target) 
    { 
     return (string)_target.GetValue(TitleProperty); 
    } 

    public static void SetTitle(UIElement _target, string _value) 
    { 
     _target.SetValue(TitleProperty, _value); 
    } 

    private static void OnTitleChanged(DependencyObject _d, DependencyPropertyChangedEventArgs _e) 
    { 
     ... 
    } 
} 

Entonces, si escribo esto:

<dl:HorizontalShelf> 
    <Label dl:MyLibCommonProperties.Title="CustomTitle">1</Label> 
    <Label>1</Label> 
    <Label>2</Label> 
    <Label>3</Label> 
</dl:HorizontalShelf> 

todo funciona bien y la propiedad recupera el especificado valor, pero si trato de obligar que la propiedad de alguna otra UIElement DependencyProperty así:

<dl:HorizontalShelf> 
    <Label dl:MyLibCommonProperties.Title="{Binding ElementName=NamedLabel, Path=Name}">1</Label> 
    <Label>1</Label> 
    <Label>2</Label> 
    <Label Name="NamedLabel">3</Label> 
</dl:HorizontalShelf> 

una excepción sería arrojado: "a 'Encuadernación' no se puede establecer en la propiedad de la 'SetTitle' de tipo 'Etiqueta'. Un 'vinculante' sólo se puede establecer en un DependencyProperty de DependencyObject."

¿Qué me falta? Encuadernación parece funcionar bien si en lugar de unirse a 'Nombre' ato a alguna otra propiedad adjunta se define en MyLibCommonProperties.

Gracias de antemano.

+0

Hola, MyLibCommonProperties debe proceder de la DependecyObject –

+1

Sólo una conjetura, pero cambiar sus Obtener/setTitle primeros parámetros de DependencyObject, no UIElement . Además, al registrar su propiedad Attache, el tercer parámetro debe ser el propietario de la propiedad adjunta, no el destino deseado. Cámbielo a MyLibCommonProperties. – dowhilefor

+0

¿Qué es 'HorizontalShelf'? ¿Lo has probado en un 'StackPanel' o control incorporado similar en su lugar? Todo lo demás parece estar bien. Solo puedo suponer que 'HorizontalShelf' es un control personalizado que no reconoce a sus hijos como hijos lógicos. Vea aquí: http://kentb.blogspot.com/2008/10/customizing-logical-children.html –

Respuesta

13

Reemplazar el UIElement en su definición DependencyProperty a MyLibCommonProperties

public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.RegisterAttached( 
     "Title", 
     typeof(String), 
     typeof(MyLibCommonProperties), // Change this line 
     new FrameworkPropertyMetadata(
      "NoTitle", new PropertyChangedCallback(OnTitleChanged)) 
     ); 

creo que podría ser debido a la unión implícitamente utiliza la especificación de la clase padre ified para llamar a SetTitle() por lo que está llamando a Label.SetTitle() en lugar de MyLibCommonProperties.SetTitle()

Tuve el mismo problema con algunas propiedades personalizadas de TextBox. Si usara typeof(TextBox) entonces no podía unirse al valor, pero si he utilizado typeof(TextBoxHelpers) entonces podría

+1

+1 ¡Fantástico! Gracias – Trap

+0

funciona para mí también. Gracias – IFink

Cuestiones relacionadas