Frage

Ich bin Ausmisten nur um mit benutzerdefinierten Steuerelemente in Silverlight und für das Leben von mir kann ich nicht die TemplateBindings an der Arbeit. Kann jemand eine einmal über geben, um zu sehen diese reduzierte Version, wenn ich etwas fehle.

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, wenn dies der TextBlock- läuft die Nummer 20. Alle Ideen, warum zeigt dies nicht?

Als Seite nicht ich habe ein separates Projekt, das eine ref an dem NumericStepperControl Baugruppe enthält und wenn es läuft die Kontrollen scheinen richtig zu bauen.

Bearbeiten ... nach etwas mehr Untersuchung ich das entdeckt habe, wenn ich die Art der Value-Eigenschaft auf eine Zeichenfolge ändern, die gut funktioniert. Warum wird ein Textblock nicht nur eine toString rufen, was in sie übergeben wird? Gibt es eine Möglichkeit diese Runde als ich sehe, kann es eine Menge passiert?

War es hilfreich?

Lösung

Nach ein bisschen es graben sich heraus, dass der Textblock tatsächlich nicht ToString auf nicht nennen, was auch immer in übergeben wird. Um dies zu umgehen Sie einen Converter verwenden müssen Sie eine ToString zu nennen.

Hier ist der Knackpunkt aber nicht Template Konverter unterstützt. Sie haben die Template zum Datacontext hinzufügen und dann Bindung in der Eigenschaft Text verwenden normale zusammen mit dem Konverter.

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 mich interessieren zu hören, wenn es keine negativen Auswirkungen hat. Auch wenn jemand dies lesen, und es ist etwas falsch mit meinem Konverter lassen Sie es mich wissen.

Prost

Andere Tipps

Es gibt verschiedene Ansätze rund um das Problem zu bekommen. Findet diese Beschreibung von Marek Latuskiewicz .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top