2010-06-18 5 views
15

J'ai un contrôle personnalisé dans WPF. Dans ce j'ai un DependencyProperty du type int. Dans le modèle pour le contrôle personnalisé, j'ai un TextBlock, et je voudrais montrer la valeur de l'entier dans le TextBlock. Mais je ne peux pas le faire fonctionner. J'ai utilisé TemplateBinding. Si j'utilise le même code mais change le type de DependencyProperty à string cela fonctionne très bien. Mais je veux vraiment que ce soit un entier pour que le reste de mon application fonctionne.WPF: Liaison d'un entier à un TextBlock avec TemplateBinding

Comment est-ce que je peux faire ceci?

J'ai écrit un code simplifié qui montre le problème. D'abord le contrôle personnalisé:

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; 
} 

Et voici mon modèle par défaut:

<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> 

et utilisation:

<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'est-ce que je fais mal?

Merci // David

Répondre

17

Essayez d'utiliser un Binding régulier avec un RelativeSource de TemplatedParent:

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

Selon this thread, ceci est une limitation de TemplateBinding:

TemplateBinding est un léger "binding", il ne supporte pas certains fea tures de conversion traditionnelle liaison, telles que le type automatiquement à l'aide les convertisseurs de type connus associés avec la propriété cible

+0

L'utilisation régulière de liaison comme celui-ci, vous pouvez également spécifier votre propre convertisseur de valeur (voir IValueConverter) que vous pouvez coder votre propre comportement de conversion de type. – Aardvark

+0

Fonctionne bien! Merci Quartermeister! :) – haagel

+0

@Aardvark: Bon point. Vous pouvez réellement spécifier un convertisseur même si vous utilisez un TemplateBinding. – Quartermeister