Domanda

Sto solo pasticciare con controlli personalizzati in silverlight e per la vita di me non riesco a TemplateBindings di lavoro.Qualcuno può dare questa versione ridotta di una volta per vedere se mi manca qualcosa.

Quindi il mio ControlTemplate nel generico.xaml sembra

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

e la mia classe di controllo si presenta come:

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

Sto aspettando quando questo viene eseguito il blocco di Testo verrà visualizzato il numero 20.Qualche idea del perchè questo non funziona?

Come un lato non ho un progetto separato che contiene un ref per il NumericStepperControl assemblea e quando esegue i controlli sembrano costruire correttamente.

Edit...dopo un po ' di più indagini ho scoperto che se cambio il tipo di Valore di proprietà di una stringa che funziona bene.Perché un blocco di testo non basta chiamare un metodo toString ciò che è passata?C'è una soluzione a questo problema, come posso vedere che succede un sacco?

È stato utile?

Soluzione

Dopo un po ' di scavare si scopre che il TextBlock, in realtà non chiamare ToString ciò che è passato.Per ovviare a questo è necessario utilizzare un Convertitore per chiamare un metodo ToString per voi.

Qui sta il problema, però, TemplateBinding non supporta i Convertitori.È necessario aggiungere il TemplateBinding a DataContext e quindi utilizzare un normale Vincolante nel Testo di proprietà lungo con il convertitore.

Così il TextBlock markup diventa

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

Il mio convertitore personalizzato:

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

Questo mi sembra un po ' un lavoro in giro e sarei interessato a sapere se ha delle implicazioni negative.Anche se qualcuno sta leggendo questo e non c'è niente di sbagliato con il mio convertitore per favore fatemelo sapere.

Cheers

Altri suggerimenti

Ci sono diversi approcci per ottenere arround il problema. trovato questo descrizione da Marek Latuskiewicz .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top