Как я могу заставить работать этот украшенный элемент управления Label? - PullRequest
0 голосов
/ 10 мая 2018

Я чувствую, что это должно было быть простым делом, но, очевидно, я делаю что-то глупое.

Я пытаюсь создать UserControl с DependencyProperty (перечислением), которое контролирует, будет ли оно просто отображать текст, предоставленный в его Content дословном свойстве, или добавляет его с дополнительным текстом.

UserControl:

<UserControl x:Class="Controls.UserControls.IndicatorLabel"
             x:Name="indicatorLabel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:enum="clr-namespace:MyNamespace;assembly=EnumAssembly">
    <Label>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Content, ElementName=indicatorLabel}" />
            <TextBlock FontStyle="Italic"
                       Margin="5,0,0,0">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Visibility"
                                Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IndicatorType}"
                                         Value="{x:Static enum:LabelIndicator.Optional}">
                                <Setter Property="Text"
                                        Value="(Optional)" />
                                <Setter Property="Visibility"
                                        Value="Visible" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IndicatorType}"
                                         Value="{x:Static enum:LabelIndicator.Required}">
                                <Setter Property="Text"
                                        Value="(Required)" />
                                <Setter Property="Visibility"
                                        Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </StackPanel>
    </Label>
</UserControl>

Код пользователя UserControl:

public partial class IndicatorLabel : UserControl
    {
        public static DependencyProperty IndicatorTypeProperty = DependencyProperty.Register("IndicatorType", typeof(LabelIndicator), typeof(IndicatorLabel));
        public LabelIndicator IndicatorType
        {
            get => (LabelIndicator)GetValue(IndicatorTypeProperty);
            set => SetValue(IndicatorTypeProperty, value);
        }

        public IndicatorLabel()
        {
            InitializeComponent();
        }
    }

Использование UserControl на другой странице XAML:

<uc:IndicatorLabel Grid.Row="4"
                   Content="Description"
                   IndicatorType="Optional" />

Я ожидал увидеть: Описание (Необязательно)

На самом деле, я не смог получить то, что в XAML UserControl, чтобы иметь какое-либо влияние, пока установлено свойство Content.

EDIT:

Причина, по которой я говорю, что это не имеет никакого эффекта, заключается в том, что даже если поместить символьную строку в свойство Text первого TextBlock, все, что находится в свойстве Content, все равно будет отображаться. Кажется, что ни TextBlock действительно не показывает.

Так почему это происходит? Разве нельзя использовать свойство Content для передачи текста в те части, которые я действительно хочу отобразить? Я нарушаю какое-то правило WPF о Content здесь?

1 Ответ

0 голосов
/ 10 мая 2018

Первый раз; да, вы не хотите использовать Content. То, что ваш XAML для вашего UC действительно говорит:

<UserControl>
    <UserControl.Content>
        ... All that stuff
    </UserControl.Content>
</UserControl>

Поэтому, когда вы назначаете Контент в родительском XAML, вы просто перезаписываете все это. Вместо этого используйте другое свойство (например, «Текст»). Если вместо UserControl вы сделали Control (с отдельным ControlTemplate и всем остальным), вы можете использовать это имя

Кроме того, {Binding IndicatorType} просматривает унаследованный контекст данных. Вам следует либо установить для себя контекст данных пользовательского элемента управления, либо использовать x:Reference, чтобы он посмотрел на сам пользовательский элемент управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...