Ho un controllo personalizzato in WPF. In questo ho un DependencyProperty
del tipo int
. Nel modello per il controllo personalizzato ho un TextBlock
, I e vorrei mostrare il valore del numero intero nel TextBlock
. Ma non riesco a farlo funzionare.WPF: Binding un numero intero a un TextBlock con TemplateBinding
Sto usando TemplateBinding
. Se utilizzo lo stesso codice ma cambio il tipo di DependencyProperty
in string
, funziona correttamente. Ma voglio davvero che sia un numero intero per far funzionare il resto della mia applicazione.
Come posso fare questo?
Ho scritto codice semplificato che mostra il problema. In primo luogo il controllo personalizzato:
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;
}
E questo è il mio modello predefinito:
<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>
e di utilizzo:
<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>
Che cosa sto facendo di sbagliato?
Grazie // David
Utilizzando regolare Binding come questo si può anche specificare la propria convertitore di valore (vedi IValueConverter), che è possibile codificare la tua comportamento di conversione del proprio tipo. – Aardvark
Funziona alla grande! Grazie Quartermeister! :) – haagel
@Aardvark: buon punto. È possibile specificare un convertitore anche se si utilizza TemplateBinding. – Quartermeister