2010-06-18 41 views
15

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

risposta

17

Provare a usare un normale Binding con un RelativeSource di TemplatedParent:

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

Secondo this thread, questa è una limitazione di TemplateBinding:

TemplateBinding è un leggero " " vincolante ", non supporta alcuni ture di leganti tradizionali, come ad tipo automaticamente la conversione utilizzando i convertitori di tipi noti associati con la proprietà target

+0

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

+0

Funziona alla grande! Grazie Quartermeister! :) – haagel

+0

@Aardvark: buon punto. È possibile specificare un convertitore anche se si utilizza TemplateBinding. – Quartermeister

Problemi correlati