2010-03-06 13 views
5

imaginar un control denominado Testko así:TemplateBinding no se une a la propiedad del efecto?

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

Nada especial, simplemente un control de vacío con un solo doble propiedad con un valor predeterminado establecido en (doble) 1. Ahora, una imagen de estilo genérico como esta:

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

Ahora, el problema es que la propiedad del radio no está obligado por alguna razón. El contenido de Wheras Button está ligado apropiadamente a la propiedad TestValue. Estoy seguro de que me falta algo obvio. ¿O no?

Respuesta

7

Si es obvio, no lo es para mí :-)

Mi libro favorito (WPF desatada) menciona que a veces TemplatedBinding no funciona (pero las razones enumeradas no coinciden con sus circunstancias).

Pero TemplatedBinding es un acceso directo para:

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

reproduje su caso, es decir, el cambio de TestValue solamente tiene efecto sobre el botón. Después de reemplazar el TemplatedBinding por esto, obtengo el efecto deseado.

+0

Después de responder, encontré http://stackoverflow.com/questions/1131222/wpf-templatebinding-vs-relativesource-templatedparent cuya respuesta es bastante interesante con respecto a la diferencia entre Binding y TemplateBinding – Timores

+0

Parece un tipo de error para yo. Gracias por la solución :-) –

+0

Aparece el error "Falta el campo de propiedad de dependencia" en el editor de XAML en "{TemplateBinding DialogHeight}", donde DialogHeight es una propiedad que pertenece a una clase derivada de "INotifyPropertyChanged". Obviamente obtener algunos errores vinculantes en tiempo de ejecución, también. Cambiar el enlace como lo indicó soluciona mis problemas. Gracias. –

Cuestiones relacionadas