Лучший способ получить доступ ко всем свойствам элемента в UserControl из MainWindow.xaml?

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

Я новичок в этом, поэтому надеюсь, что мой вопрос не глупый.

Допустим, существует простой UserControl (назовем его MyUC), подобный этому

 <UserControl x:Class="MyUC.MyUC"
         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:MyUC"
         mc:Ignorable="d" d:DesignWidth="311" Height="150">

  <Grid>
    <Label x:Name="_lbl1" Width="104" Height="26" Margin="13,23,0,0"/>
    <Label x:Name="_lbl2"  Width="104" Height="26" Margin="13,53,0,0"/>
  <Grid/>
<UserControl/>
  

Если я правильно понимаю, если я хочу получить доступ к свойствам этих элементов (например, содержимому меток) в этом UserControl (MyUC) из MainWindow.xaml, мне нужно было бы добавить эти свойства в MyUC.xaml.cs

 public static readonly DependencyProperty Label_1_ContentProperty =
 DependencyProperty.Register("Label_1_Content", typeof(string), typeof(MyUC));

Public string Label_1_Content
{
  get { return (string)GetValue(Label_1_ContentProperty); }
  set { SetValue(Label_1_ContentProperty, value); }
}

public static readonly DependencyProperty Label_2_ContentProperty =
 DependencyProperty.Register("Label_2_Content", typeof(string), typeof(MyUC));

Public string Label_2_Content
{
  get { return (string)GetValue(Label_2_ContentProperty); }
  set { SetValue(Label_2_Content_2_Property, value); }
}
  

добавьте эту привязку к содержимому _lbl1 и _lbl2 в MyUC.xalm

 <Label x:Name="_lbl1" Width="104" Height="26" Margin="13,23,0,0"
       Content="{Binding Label_1_Content, RelativeSource={RelativeSource
                 AncestorType={x:Type local:MyUC}}}"/>

<Label x:Name="_lbl2" Width="104" Height="26" Margin="13,53,0,0"
       Content="{Binding Label_2_Content, RelativeSource={RelativeSource
                 AncestorType={x:Type local:MyUC}}}"/>
  

и тогда эти свойства метки доступны и могут быть установлены из MainWindow.xalm следующим образом

 <control:MyUC Label_1_Content="This is the Label _lbl1 in the UserControl"
              Label_2_Content="This is the Label _lbl2 in the UserControl"/>
  

но я думаю, что это не очень хороший способ сделать, потому что, если в UserControl мне нужно получить доступ к нескольким свойствам
, тогда потребуется множество этих свойств зависимостей.

Мой вопрос: можно ли сделать это более простым и использовать для каждой метки (_lbl1 и _lbl2) собственные свойства напрямую и иметь возможность делать в MainWindow.xaml что-то вроде этого

 <control:MyUC _lbl1.Content="This is the Label _lbl1 in the UserControl"
              _lbl2.Content="This is the Label _lbl2 in the UserControl"/>
  

и как это должно быть сделано в этом случае или, если это невозможно, как мне это сделать?

Любая помощь приветствуется

Комментарии:

1. Вы хотите использовать CodeBehind или шаблон MVVM?

2. Если у вас много одинаковых элементов управления в простой компоновке (например, все метки одинакового размера, расположенные вертикально или горизонтально), вам лучше использовать ItemsControl .

3.То, что вы делаете, правильно, точка в a UserControl предназначена именно для такого сценария, вы создаете повторно используемую группу элементов управления. Гораздо лучше создать один UserControl с большим количеством свойств зависимостей, чем повторять себя снова и снова.

4. Майк Исон: Я понимаю, что повторное использование против повторения, и именно поэтому я хочу иметь возможность делать как _lbl1.anyproperties и _lbl2.anyproperties, если это возможно..

5. Rom: Прямо сейчас я использую CodeBehind.