2012-02-28 14 views
7

Tengo una clase derivada del control deslizante que usa una plantilla de control personalizada y tiene algunas propiedades de dependencia agregadas. Me gustaría disparar activadores dentro de la plantilla en función de las nuevas propiedades.Cómo usar propiedades personalizadas en un activador ControlTemplate

Por ejemplo, tengo una nueva propiedad de dependencia llamada ThumbIsVisible que cuando se establece en falso, quiero que la parte del control deslizante de mi control deslizante sea hiddin. Mi plantilla de control se ve así:

<Slider.Template> 
<ControlTemplate TargetType="{x:Type Slider}"> 
... 
<Track.Thumb> 
<Thumb x:Name="m_Thumb" Style="{StaticResource SliderThumbStyle}" /> 
... 

me gustaría añadir en un disparador que se parece a:

<ControlTempate.Trigger> 
<Trigger Property="ThumbIsVisible" Value="False"> 
<Setter TargetName="m_Thumb" Property="Visibility" Value="Collapsed" /> 

De buenas a primeras Puedo ver que esto no va a funcionar como tengo la década de tempate de control Tipo de objetivo establecido en Control deslizante. Sin embargo, si cambio eso para decir:

<ControlTemplate TargetType="{x:Type local:myCustomSlider}"> 

entonces me encuentro con problemas con el tipo de plantilla que difiere de los controles. La única forma de evitar esto es crear el xaml usando el local: myCustomSlider como tipo en lugar de Slider. Sin embargo, hacer esto causa muchos problemas con el diseñador y el código de VisualStudio.

¿Alguien sabe si hay una forma estándar de evitar todo esto? Como solución, intenté agregar los desencadenadores de la plantilla a través de código subyacente, pero no he podido lograr que funcionen.

+2

Agregue la solución como respuesta y acéptela para que no se quede sin respuesta. – kevev22

+0

Lo haré en cuanto alcance la reputación de 100 o mi límite de respuestas automáticas de novatos de 8 horas habrá terminado. – BruceLH

Respuesta

2

Parece que hay una manera aún más simple de resolver este problema.

<ControlTemplate.Triggers> 
    <DataTrigger Property=local:CustomSlider.ThumbIsVisible" Value="False">  
    <Setter TargetName="m_Thumb" Property="Visibility" Value="Hidden" /> 
    </DataTrigger> 
</ControlTemplate.Triggers> 

donde local es el espacio de nombre de la clase CustomSlider.

+0

'DataTrigger' no contiene la propiedad' Property' en .NET 4. ¿Cómo le funciona? – Nayan

+0

@Nayan: Un poco tarde, pero supongo que se supone que es 'Trigger' no' DataTrigger'. – dotNET

2

Por supuesto, solo me toma 30 minutos después de publicar mi pregunta para encontrar la respuesta cuando pasé dos días buscándola primero. Oh, bueno, la solución es usar DataTriggers.

<ControlTemplate.Triggers> 
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ThumbIsVisible}" Value="False"> 
    <Setter TargetName="m_Thumb" Property="Visibility" Value="Hidden" /> 
    </DataTrigger> 
</ControlTemplate.Triggers> 

La clave es usar RelativeSource = {RelativeSource Self} para encontrar la propiedad personalizada. Después de eso, funciona exactamente como se esperaba.

Cuestiones relacionadas