2011-11-11 16 views
9

I 'scrittura di una libreria di controllo. In questa libreria ci sono alcuni pannelli personalizzati che sono popolati con UIElements dell'utente. Dal momento che ogni elemento figlio nella mia lib deve avere una proprietà "Titolo", ho scritto il seguente:Impossibile associare una proprietà associata a un'altra proprietà di dipendenza

// 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) 
    { 
     ... 
    } 
} 

Poi, se scrivo questo:

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

tutto funziona bene e la proprietà ottiene il specificata valore, ma se provo ad associare la proprietà a qualche altra UIElement DependencyProperty in questo modo:

<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> 

un'eccezione sarebbe stato gettato: "a 'vincolante' non può essere impostato sulla proprietà 'SetTitle' di tipo "Etichetta". A 'Binding' può essere impostato solo su un DependencyProperty di DependencyObject."

Che cosa mi manca? Binding sembra funzionare bene se invece di legame al 'Nome' mi legano a qualche altra proprietà associata definito MyLibCommonProperties.

Grazie in anticipo.

+0

Ciao, MyLibCommonProperties deve derivare da DependecyObject –

+1

Solo una supposizione, ma cambia le Get/setTitle primi parametri da DependencyObject, non UIElement . Anche durante la registrazione della proprietà di Attache, il terzo parametro deve essere il proprietario della proprietà associata, non la destinazione desiderata. Passalo a MyLibCommonProperties. – dowhilefor

+0

Che cos'è 'HorizontalShelf'? Lo hai provato con un 'StackPanel' o un controllo integrato simile? Tutto il resto sembra a posto. Posso solo supporre che 'HorizontalShelf' sia un controllo personalizzato che non riconosce i suoi figli come figli logici. Vedi qui: http://kentb.blogspot.com/2008/10/customizing-logical-children.html –

risposta

13

Sostituire la UIElement nella definizione DependencyProperty per MyLibCommonProperties

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

Penso che potrebbe essere perché l'associazione utilizza implicitamente la specifica classe padre per chiamare lo SetTitle() in modo da chiamare anziché MyLibCommonProperties.SetTitle()

Ho avuto lo stesso problema con alcune proprietà personalizzate di TextBox. Se ho usato typeof(TextBox) quindi non ho potuto associare al valore, ma se ho usato typeof(TextBoxHelpers) allora potrei

+1

+1 Fantastico! Grazie – Trap

+0

funziona anche per me. Grazie – IFink

Problemi correlati