Привязки шаблона в пользовательских элементах управления - PullRequest
4 голосов
/ 16 апреля 2009

Я просто слоняюсь с пользовательскими элементами управления в Silverlight, и я не могу заставить работать TemplateBindings. Может ли кто-нибудь дать эту уменьшенную версию еще раз, чтобы увидеть, что я что-то упустил.

Так что мой ControlTemplate в generic.xaml выглядит как

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

и мой класс управления выглядит так:

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

Я ожидаю, что при запуске TextBlock отобразится число 20. Есть идеи, почему это не работает?

С другой стороны, у меня есть отдельный проект, который содержит ссылку на сборку NumericStepperControl, и когда он запускается, элементы управления выглядят правильно.

Редактировать ... после более подробного изучения я обнаружил, что если я изменю тип свойства Value на строку, которая работает нормально. Почему текстовый блок не просто вызывает toString для всего, что передается в него? Есть ли способ обойти это, как я вижу, это часто происходит?

Ответы [ 2 ]

11 голосов
/ 17 апреля 2009

После небольшого копания выясняется, что TextBlock фактически не вызывает ToString для всего, что передается. Чтобы обойти это, вы должны использовать Converter для вызова ToString для вас.

Вот в чем проблема, TemplateBinding не поддерживает конвертеры. Необходимо добавить TemplateBinding в DataContext, а затем использовать обычное связывание в свойстве Text вместе с конвертером.

Таким образом, разметка TextBlock становится

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

Мой пользовательский конвертер:

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

Это кажется чем-то вроде работы, и мне было бы интересно узнать, имеет ли это какие-либо неблагоприятные последствия. Также, если кто-то читает это и что-то не так с моим конвертером, пожалуйста, дайте мне знать.

Приветствия

0 голосов
/ 14 февраля 2010

Существуют разные подходы к решению проблемы. Нашел это описание у Марека Латускевича .

...