Как получить доступ к кнопкам внутри 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.

Ответы на вопрос(6)

Ваш ответ на вопрос