#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.