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
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
¡Funciona muy bien! Gracias Quartermeister! :) – haagel
@Aardvark: Buen punto. En realidad, puede especificar un convertidor aunque use un enlace de plantilla. – Quartermeister