Пользовательский элемент управления WPF: привязка к свойству свойства - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь создать пользовательский элемент управления WPF, в основном текстовый блок с маленькими кружочками с каждой стороны для отображения коротких числовых значений. Я создал класс (LabelProperties), который инкапсулирует настройки (текст, кисть переднего плана, кисть фона, видимость) для каждого круга, а затем добавил свойство в пользовательский элемент управления для кругов слева и справа. Элемент управления обычно работает так, как мне хотелось бы, но привязка данных не работает для текста круга.

Я новичок в WPF и предполагаю, что пытаюсь сделать это способом, который не поддерживается моделью привязки. Буду очень признателен за любую помощь.

Класс LabelProperties

public class LabelProperties : DependencyObject
{
    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register("Text", typeof(string), typeof(LabelProperties));
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty VisibilityProperty = 
        DependencyProperty.Register("Visibility", typeof(Visibility), typeof(LabelProperties));
    public Visibility Visibility
    {
        get { return (Visibility)GetValue(VisibilityProperty); }
        set { SetValue(VisibilityProperty, value); }
    }

    public static readonly DependencyProperty ForegroundProperty = 
        DependencyProperty.Register("Foreground", typeof(Brush), typeof(LabelProperties));
    public Brush Foreground
    {
        get { return (Brush)GetValue(ForegroundProperty); }
        set { SetValue(ForegroundProperty, value); }
    }

    public static readonly DependencyProperty BackgroundProperty = 
        DependencyProperty.Register("Background", typeof(Brush), typeof(LabelProperties));
    public Brush Background
    {
        get { return (Brush)GetValue(BackgroundProperty); }
        set { SetValue(BackgroundProperty, value); }
    }

Пользовательская разметка

<UserControl x:Class="ControlTest.DisplayBlock"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="106" d:DesignWidth="251"
             x:Name="_userControl">
    <Grid x:Name="_grid" Height="40" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="30" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="26" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Border Background="{Binding BlockBackground, ElementName=_userControl, Mode=TwoWay}" 
                Grid.ColumnSpan="3" Grid.RowSpan="2" CornerRadius="10" BorderThickness="1" BorderBrush="Black"  Margin="12,0">
        </Border>
        <Ellipse Fill="{Binding Path=LeftCircle.Background, ElementName=_userControl, Mode=TwoWay}" 
                 Visibility="{Binding Path=LeftCircle.Visibility, ElementName=_userControl, Mode=TwoWay}"
                 Stroke="Black" Grid.Column="0" StrokeThickness="2" Margin="2" />
        <TextBlock Foreground="{Binding Path=LeftCircle.Foreground, ElementName=_userControl, Mode=TwoWay}" 
                   Text="{Binding Path=LeftCircle.Text, ElementName=_userControl, Mode=TwoWay}"
                   HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Grid.Column="0" />
        <Ellipse Fill="{Binding Path=RightCircle.Background, ElementName=_userControl, Mode=TwoWay}" 
                 Visibility="{Binding Path=RightCircle.Visibility, ElementName=_userControl, Mode=TwoWay}"
                 Stroke="Black" Grid.Column="2" StrokeThickness="2" Margin="2" />
        <TextBlock Foreground="{Binding Path=RightCircle.Foreground, ElementName=_userControl, Mode=TwoWay}" 
                   Text="{Binding Path=RightCircle.Text, ElementName=_userControl, Mode=TwoWay}"
                   HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Grid.Column="2" />
        <TextBlock Text="{Binding Path=Text, ElementName=_userControl, Mode=TwoWay}" 
                   Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.RowSpan="2" FontSize="16" Margin="4" />
    </Grid>
</UserControl>

Код контроля пользователя

public partial class DisplayBlock : UserControl
{
    public DisplayBlock()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register("Text", typeof(string), typeof(DisplayBlock));
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty BlockBackgroundProperty =
        DependencyProperty.Register("BlockBackground", typeof(Brush), typeof(DisplayBlock));
    public Brush BlockBackground
    {
        get { return (Brush)GetValue(BlockBackgroundProperty); }
        set { SetValue(BlockBackgroundProperty, value); }
    }

    public static readonly DependencyProperty LeftCircleProperty =
        DependencyProperty.Register("LeftCircle", typeof(LabelProperties), typeof(DisplayBlock));
    public LabelProperties LeftCircle
    {
        get { return (LabelProperties)GetValue(LeftCircleProperty); }
        set { SetValue(LeftCircleProperty, value); }
    }

    public static readonly DependencyProperty RightCircleProperty =
        DependencyProperty.Register("RightCircle", typeof(LabelProperties), typeof(DisplayBlock));
    public LabelProperties RightCircle
    {
        get { return (LabelProperties)GetValue(RightCircleProperty); }
        set { SetValue(RightCircleProperty, value); }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...