2010-06-18 13 views
15

Ich habe ein benutzerdefiniertes Steuerelement in WPF. In diesem habe ich eine DependencyProperty des Typs int. In der Vorlage für das benutzerdefinierte Steuerelement habe ich eine TextBlock, I und möchte den Wert der Ganzzahl in der TextBlock zeigen. Aber ich kann es nicht zur Arbeit bringen.WPF: Binding eine ganze Zahl zu einem TextBlock mit TemplateBinding

Ich verwende TemplateBinding. Wenn ich den gleichen Code verwende, aber den Typ des DependencyProperty zu string ändern, funktioniert es gut. Aber ich möchte wirklich, dass es eine ganze Zahl ist, damit der Rest meiner Anwendung funktioniert.

Wie kann ich das tun?

Ich habe einen vereinfachten Code geschrieben, der das Problem zeigt. Zunächst wird die individuelle Steuerung:

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

Und das ist meine Standardvorlage:

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

Und Nutzung:

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

Was mache ich falsch?

Dank // David

Antwort

17

Versuchen Sie, eine regelmäßige Binding mit einem RelativeSource von TemplatedParent mit:

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

Nach this thread, dies eine Einschränkung von TemplateBinding ist:

Template ist ein Leichtgewicht "Bindung", es unterstützt nicht einige fea turen der traditionellen Bindung, wie mit die bekannten Typ-Wandlern verbunden sind mit der Zieleigenschaft

+0

regelmäßige Verwendung wie diese Bindung können Sie auch Ihren eigenen Wert Konverter angeben (siehe IValueConverter), die Sie als automatisch Umwandlung Typ Code Ihre eigenes Typkonvertierungsverhalten. – Aardvark

+0

Funktioniert gut! Danke Quartermeister! :) – haagel

+0

@Aardvark: Guter Punkt. Sie können sogar einen Konverter angeben, selbst wenn Sie eine TemplateBinding verwenden. – Quartermeister