WPF: привязка целого числа к TextBlock с помощью TemplateBinding - PullRequest
15 голосов
/ 18 июня 2010

У меня есть пользовательский элемент управления в WPF. В этом у меня есть DependencyProperty типа int. В шаблоне для пользовательского элемента управления у меня есть TextBlock, я и хотел бы показать значение целого числа в TextBlock. Но я не могу заставить его работать.

Я использую TemplateBinding. Если я использую тот же код, но меняю тип DependencyProperty на string, он работает нормально. Но я действительно хочу, чтобы это оставалось целым числом, чтобы остальная часть моего приложения работала.

Как я могу это сделать?

Я написал упрощенный код, который показывает проблему. Сначала пользовательский элемент управления:

public class MyCustomControl : Control
{
    static MyCustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));

        MyIntegerProperty = DependencyProperty.Register("MyInteger", typeof(int), typeof(MyCustomControl), new FrameworkPropertyMetadata(0));
    }


    public int MyInteger
    {
        get
        {
            return (int)GetValue(MyCustomControl.MyIntegerProperty);
        }
        set
        {
            SetValue(MyCustomControl.MyIntegerProperty, value);
        }
    }
    public static readonly DependencyProperty MyIntegerProperty;
}

И это мой шаблон по умолчанию:

<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
                <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" Background="Azure">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{TemplateBinding MyInteger}" HorizontalAlignment="Center" />
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

И использование:

<Window x:Class="CustomControlBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:CustomControlBinding"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <local:MyCustomControl Width="100" Height="100" MyInteger="456" />
</Grid>

Что я делаю не так?

Спасибо // Дэвид

1 Ответ

18 голосов
/ 18 июня 2010

Попробуйте использовать обычный Binding с RelativeSource из TemplatedParent:

<TextBlock Text="{Binding MyInteger, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" />

Согласно этой теме , это ограничение TemplateBinding:

TemplateBinding - это легкий "связывание", оно не поддерживает некоторые особенности традиционного переплета, такие как как автоматическое преобразование типа с помощью известные преобразователи типа связаны с целевым свойством

...