Pregunta

Yo sólo curioseaba con los controles personalizados en Silverlight y para la vida de mí no puedo conseguir los TemplateBindings para trabajar. ¿Puede alguien dar esta versión reducida una vez más para ver si me falta algo.

Así que mi ControlTemplate en el generic.xaml parece

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

y mi clase de control se ve así:

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

Estoy esperando cuando este corre el TextBlock mostrará el número 20. ¿Alguna idea de por qué esto no está funcionando?

Como un lado, no tengo un proyecto separado que contiene una referencia a la asamblea NumericStepperControl y cuando se ejecuta los controles parecen construir correctamente.

Editar ... después de un poco más de investigación he descubierto que si cambio el tipo de la propiedad Value de una cadena que funciona bien. ¿Por qué un bloque de texto no sólo llamar a un toString en lo que se pasó a ella? ¿Hay una manera alrededor de esto como puedo ver que pasa mucho?

¿Fue útil?

Solución

Después de un poco de excavación resulta que TextBlock realidad no llama ToString en todo lo que se ha pasado. Para solucionar este debe utilizar un convertidor para llamar a un ToString para usted.

Aquí está el problema, sin embargo, TemplateBinding no es compatible con convertidores. Usted tiene que añadir el TemplateBinding a la DataContext y luego el uso normal de encuadernación en la propiedad Text junto con el convertidor.

Así que el marcado se convierte en TextBlock

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

Mi convertidor personalizado:

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

Este parece ser un poco de un trabajo alrededor y estaría interesado en saber si tiene alguna implicación adversos. También si alguien está leyendo esto y no hay nada malo con mi convertidor favor hágamelo saber.

Saludos

Otros consejos

Existen diferentes enfoques para obtener arround el problema. Encontrado este Descripción de Marek Latuskiewicz .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top