Как получить доступ к кнопкам внутри UserControl из xaml?
На работе у меня есть несколько страниц, каждая с кнопками в тех же местах, и с одинаковыми свойствами. Каждая страница также имеет небольшие отличия. Для этого мы создали шаблон userControl и поместили в него все кнопки, а затем применили этот пользовательский элемент управления ко всем страницам. Однако теперь довольно сложно получить доступ к кнопкам и изменить их из xaml каждой страницы, потому что они находятся внутри UserControl на странице .....Как мне элегантно получить доступ к кнопкам на каждой странице?
Что я пробовал:
В настоящее время мы связываем с кучей свойств зависимостей. Мне не нравится эта опция, потому что у меня много кнопок, и мне нужно управлять множеством свойств этих кнопок. Результатом являются сотни свойств зависимостей и настоящий беспорядок, когда нужно что-то изменить.
Другой метод заключается в использовании стилей. Мне в целом нравится этот метод, но поскольку эти кнопки находятся внутри другого элемента управления, их становится сложно изменить, и шаблон будет правильным только для одной кнопки в одно время.
Адам Кемп написал о том, чтобы позволить пользователю просто вставить свою кнопкуВоти это метод, который я сейчас пытаюсь реализовать / изменить. К сожалению, у меня нет доступа к Xamarin.
Хотя шаблонявляется вставляется при запуске кода, шаблонне является обновление кнопки правильно. Если я поставлю точку останова в MyButton Setter, я вижу, чтозначение на самом деле пустая кнопка, а не та, которую я назначил в главном окне. Как это исправить?
Вот несколько упрощенных кодов:
Мой шаблон UserControl's xaml:
<UserControl x:Class="TemplateCode.Template"
x:Name="TemplatePage"
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="350"
d:DesignWidth="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Background="DarkGray">
<Grid>
<Button x:Name="_button" Width="200" Height="100" Content="Template Button"/>
</Grid>
</UserControl>
Код моего пользовательского элемента управления позади:
using System.Windows.Controls;
namespace TemplateCode
{
public partial class Template : UserControl
{
public static Button DefaultButton;
public Template()
{
InitializeComponent();
}
public Button MyButton
{
get
{
return _button;
}
set
{
_button = value; //I get here, but value is a blank button?!
// Eventually, I'd like to do something like:
// Foreach (property in value)
// {
// If( value.property != DefaultButton.property) )
// {
// _button.property = value.property;
// }
// }
// This way users only have to update some of the properties
}
}
}
}
А теперь приложение, где я хочу его использовать:
<Window x:Class="TemplateCode.MainWindow"
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"
xmlns:templateCode="clr-namespace:TemplateCode"
Title="MainWindow"
Height="350"
Width="525"
Background="LimeGreen"
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<Grid>
<templateCode:Template>
<templateCode:Template.MyButton>
<Button Background="Yellow"
Content="Actual Button"
Width="200"
Height="100"/>
</templateCode:Template.MyButton>
</templateCode:Template>
</Grid>
</Window>
А теперь код позади:
Using System.Windows;
Namespace TemplateCode
{
Public partial class MainWindow : Window
{
Public MainWindow()
{
InitializeComponent();
}
}
}
Редактировать: Хотя я хочу удалить ненужные свойства зависимости вшаблон userControl, я все еще хотел бы установить привязки накнопкасвойства из XAML.