2010-03-06 9 views
5

Immaginate un controllo denominato Testko come questo:TemplateBinding non si associa alla proprietà dell'effetto?

public class Testko: Control 
    { 
     public static readonly DependencyProperty TestValueProperty; 

     static Testko() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(Testko), new FrameworkPropertyMetadata(typeof(Testko))); 
      TestValueProperty = DependencyProperty.Register("TestValue", typeof(double), typeof(Testko), new UIPropertyMetadata((double)1)); 
     } 

     public double TestValue 
     { 
      get { return (double)GetValue(TestValueProperty); } 
      set { SetValue(TestValueProperty, value); } 
     } 
    } 

Niente di speciale, solo un controllo vuoto con un solo doppio proprietà con un valore di default è impostato su (doppio) 1. Ora, un'immagine di stile generico come questo:

<Style TargetType="{x:Type local:Testko}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:Testko}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <StackPanel Orientation="Vertical"> 
         <StackPanel.Effect> 
          <BlurEffect Radius="{TemplateBinding TestValue}" /> 
         </StackPanel.Effect> 
         <Button Content="{TemplateBinding TestValue}" Margin="4" /> 
        </StackPanel> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ora, il problema è che la proprietà Raggio non è mai legato per qualche motivo. Dove il contenuto di Button è correttamente associato alla proprietà TestValue. Sono sicuro che mi manca qualcosa di ovvio. O no?

risposta

7

Se è ovvio, non è per me :-)

Il mio libro preferito (WPF Unleashed) afferma che a volte TemplatedBinding non funziona (ma le ragioni enumerate non corrispondono le circostanze).

Ma TemplatedBinding è una scorciatoia per:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TestValue} 

ho riprodotto il vostro caso, vale a dire la modifica TestValue ha effetto solo sul pulsante. Dopo aver sostituito TemplatedBinding di questo, ottengo l'effetto desiderato.

+0

Dopo aver risposto, ho trovato http://stackoverflow.com/questions/1131222/wpf-templatebinding-vs-relativesource-templatedparent la cui risposta è abbastanza interessante per quanto riguarda la differenza tra Binding e TemplateBinding – Timores

+0

Sembra una specie di bug per me. Grazie per la soluzione :-) –

+0

Ricevo l'errore "Campo proprietà dipendenza mancante" segnalato nell'editor XAML su "{TemplateBinding DialogHeight}", dove DialogHeight è una proprietà che appartiene a una classe derivata da "INotifyPropertyChanged". Ovviamente anche in fase di runtime ci sono alcuni errori di binding. Cambiare il binding come consigliato risolve i miei problemi. Grazie. –

Problemi correlati