Как получить доступ к дочернему элементу управления WPF UserControl, представленному как DependencyProperty? - PullRequest
0 голосов
/ 09 апреля 2020

Вопрос задавался ранее, но я не нашел удовлетворительного ответа. Скажем, у вас есть UserControl как это:

<UserControl x:Class="TestShowUserControl.UserControl1"
         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" 
         xmlns:local="clr-namespace:TestShowUserControl"
         mc:Ignorable="d" 
         d:DesignHeight="40" d:DesignWidth="200">

<d:DesignerProperties.DesignStyle>
    <Style TargetType="UserControl">
        <Setter Property="Background" Value="White"/>
    </Style>
</d:DesignerProperties.DesignStyle>

<DockPanel>
    <Label x:Name="lblCaption" DockPanel.Dock="Left" Content="Caption"/>
    <TextBox Text="Hi there"/>
</DockPanel>

Элемент управления Label выставляется через DependencyProperty как это:

public partial class UserControl1 : UserControl
{
    #region DependencyProperties

    public static readonly DependencyProperty MyCaptionControlProperty = DependencyProperty
    .Register(nameof(MyCaptionControl),
        typeof(Label),
        typeof(UserControl1),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    #endregion

    #region Properties

    public Label MyCaptionControl
    {
        get { return (Label)GetValue(MyCaptionControlProperty); }
        set { SetValue(MyCaptionControlProperty, value); }
    }

    #endregion

    public UserControl1()
    {
        InitializeComponent();

        MyCaptionControl = lblCaption;
    }
}

Как Могу ли я сделать следующее:

<local:UserControl1 MyCaptionControl.Visibility="Collapsed"/>

Если это невозможно, есть ли другой способ сделать это в XAML? Обратите внимание, что я хочу использовать Метку, как если бы я сам объявил ее локально и чтобы я мог при необходимости привязывать ее содержимое к ViewModel. Тем не менее, необходимость разоблачения Style может быть альтернативой, а лучшее решение невозможно.

1 Ответ

0 голосов
/ 09 апреля 2020

Как отметил @ mm8 в комментариях, техническая проблема не актуальна, потому что подход не был правильным. Цель UserControl - предоставить многократно используемый интерфейс для определенной задачи. Потребитель UserControl не должен знать о его компонентах, так как они могут измениться в будущем. Теперь так называемый MyCaptionControl имеет тип Label, но это может быть TextBlock или что-то еще. Поэтому вопрос считается ответом.

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