Question

Je suis juste déblayage au sujet des contrôles personnalisés dans silverlight et pour la vie de moi je ne peux pas obtenir les TemplateBindings de travailler. Quelqu'un peut-il donner à cette version réduite une fois pour voir si je manque quelque chose.

Donc, mon ControlTemplate dans le generic.xaml ressemble

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

et ma classe de contrôle ressemble à:

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

Je me attends quand cela va TextBlock affiche le numéro 20. Toutes les idées pour lesquelles cela ne fonctionne pas?

Comme un côté pas avoir un projet distinct qui contient une ref à l'assemblée NumericStepperControl et quand il exécute les commandes semblent construire correctement.

Modifier ... après un peu plus enquête que j'ai découvert que si je change le type de la propriété de la valeur à une chaîne qui fonctionne très bien. Pourquoi un bloc de texte non seulement appeler un toString sur tout ce qui est passé en elle? Y at-il un moyen de contourner ce que je peux voir qu'il se passe beaucoup?

Était-ce utile?

La solution

Après un peu de creuser, il se trouve que le TextBlock ne remet pas en fait ToString sur tout ce qui est passé. Pour contourner cela, vous devez utiliser un convertisseur pour appeler un ToString pour vous.

Voici le hic cependant, TemplateBinding ne supporte pas les convertisseurs. Vous devez ajouter le TemplateBinding au DataContext, puis d'une utilisation normale de reliure dans la propriété Text avec le convertisseur.

Ainsi, le balisage TextBlock devient

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

Mon convertisseur personnalisé:

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

Cela semble être un peu d'un travail autour et je serais intéressé d'entendre si elle a des conséquences néfastes. Aussi, si quelqu'un est en train de lire ceci et il y a quelque chose de mal avec mon convertisseur s'il vous plaît laissez-moi savoir.

Vive

Autres conseils

Il existe différentes approches pour obtenir arround le problème. trouvé ce Description de Marek Latuskiewicz .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top