2009-04-16 10 views
4

Ich bin nur mit benutzerdefinierten Steuerelemente in Silverlight mucken und für das Leben von mir kann ich nicht die TemplateBindings funktionieren. Kann jemand diese reduzierte Version einmal geben, um zu sehen, ob ich etwas verpasse?TemplateBindings in benutzerdefinierten Steuerelementen

Also meine Control im generic.xaml sieht aus wie

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:NumericStepperControl;assembly=NumericStepperControl"> 
    <Style TargetType="local:NumericStepper"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:NumericStepper"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition /> 
          <ColumnDefinition /> 
         </Grid.ColumnDefinitions> 

         <Border Grid.Column="0" BorderBrush="Black" BorderThickness="2" Width="50" Height="30"> 
          <TextBlock Width="50" Height="30" Text="{TemplateBinding Value}" /> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value>   
     </Setter> 
    </Style> 
</ResourceDictionary> 

und meine Steuerklasse wie folgt aussieht:

namespace NumericStepperControl 
{ 
    public class NumericStepper : Control 
    { 
     public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(NumericStepper), new PropertyMetadata(20)); 

     public NumericStepper() 
      : base() 
     { 
      DefaultStyleKey = typeof(NumericStepper); 
     } 

     public int Value 
     { 
      get 
      { 
       return (int)GetValue(ValueProperty); 
      } 
      set 
      { 
       SetValue(ValueProperty, value); 
      } 
     } 
    } 
} 

ich erwarte ich, wenn dies der TextBlock- läuft wird 20 die Nummer angezeigt werden soll. Irgendwelche Ideen, warum das nicht funktioniert?

Als eine Seite nicht ich habe ein separates Projekt, das eine Referenz auf die NumericStepperControl Assembly enthält und wenn es ausgeführt wird scheinen die Steuerelemente korrekt zu erstellen.

Edit ... nach ein bisschen mehr Untersuchung habe ich festgestellt, dass, wenn ich den Typ der Value-Eigenschaft in eine Zeichenfolge ändern, die gut funktioniert. Warum ruft ein Textblock nicht einfach einen toString auf, was auch immer an ihn übergeben wird? Gibt es einen Weg um dies zu tun, da ich sehe, dass es viel passiert?

Antwort

11

Nach ein wenig Graben stellt sich heraus, dass der TextBlock ToString tatsächlich nicht auf dem eingeht, was übergeben wird. Um dies zu umgehen, müssen Sie einen Konverter verwenden, um einen ToString für Sie aufzurufen.

Hier ist der reiben jedoch, TemplateBinding unterstützt keine Konverter. Sie müssen das TemplateBinding dem DataContext hinzufügen und dann die normale Bindung in der Text-Eigenschaft zusammen mit dem Konverter verwenden.

So ist die TextBlock- Markup wird

<TextBlock Width="50" Height="30" DataContext="{TemplateBinding Value}" Text="{Binding Converter={StaticResource NumberTypeToStringConverter}}" /> 

Mein benutzerdefinierter Konverter:

public class NumberTypeToStringConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value == null) 
      { 
       throw new NullReferenceException(); 
      } 

      return value.ToString(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      MethodInfo methodInfo = targetType.GetMethod("Parse"); 

      if (methodInfo == null) 
      { 
       throw new MissingMethodException("The targetType to convert back to a Number must implement a Parse method"); 
      } 

      return methodInfo.Invoke(null, new object[] { value }); 
     } 
    } 

Dies scheint ein bisschen eine Arbeit um und ich würde daran interessiert zu hören, wenn es keine negativen Auswirkungen hat . Auch wenn jemand dies liest und irgendetwas mit meinem Konverter nicht stimmt, lass es mich wissen.

Prost

+0

Ich habe gerade fast einen Tag verbrannt, um das herauszufinden. Danke für deine eigene Antwort James - sehr fleißig !! –

Verwandte Themen