2010-06-18 29 views
15

Tengo un control personalizado en WPF. En esto tengo un DependencyProperty del tipo int. En la plantilla para el control personalizado tengo un TextBlock, y me gustaría mostrar el valor del entero en el TextBlock. Pero no puedo hacer que funcione.WPF: enlazar un número entero a un TextBlock con TemplateBinding

Estoy usando TemplateBinding. Si utilizo el mismo código pero cambio el tipo de DependencyProperty a string, funciona bien. Pero realmente quiero que sea un número entero para que el resto de mi aplicación funcione.

¿Cómo puedo hacer esto?

He escrito un código simplificado que muestra el problema. En primer lugar el control personalizado:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 

     MyIntegerProperty = DependencyProperty.Register("MyInteger", typeof(int), typeof(MyCustomControl), new FrameworkPropertyMetadata(0)); 
    } 


    public int MyInteger 
    { 
     get 
     { 
      return (int)GetValue(MyCustomControl.MyIntegerProperty); 
     } 
     set 
     { 
      SetValue(MyCustomControl.MyIntegerProperty, value); 
     } 
    } 
    public static readonly DependencyProperty MyIntegerProperty; 
} 

Y esta es mi plantilla por defecto:

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" Background="Azure"> 
        <StackPanel Orientation="Vertical"> 
         <TextBlock Text="{TemplateBinding MyInteger}" HorizontalAlignment="Center" /> 
        </StackPanel> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

y uso:

<Window x:Class="CustomControlBinding.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomControlBinding" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <local:MyCustomControl Width="100" Height="100" MyInteger="456" /> 
</Grid> 

¿Qué estoy haciendo mal?

Gracias // David

Respuesta

17

Trate de usar un habitual Binding con un RelativeSource de TemplatedParent:

<TextBlock Text="{Binding MyInteger, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" /> 

Según this thread, esto es una limitación de TemplateBinding:

TemplateBinding es una ligero "vinculante", no es compatible con algunos fea turas de conversión de encuadernación, tales escribir como forma automática tradicional utilizando los convertidores de tipos conocidos asociados con la propiedad de destino

+0

El uso regular de unión como esta también puede especificar su propio convertidor de valores (ver IValueConverter) que se puede codificar su propio tipo de comportamiento de conversión. – Aardvark

+0

¡Funciona muy bien! Gracias Quartermeister! :) – haagel

+0

@Aardvark: Buen punto. En realidad, puede especificar un convertidor aunque use un enlace de plantilla. – Quartermeister

Cuestiones relacionadas