¿Cómo accedo a los botones dentro de un UserControl desde xaml?

En el trabajo tengo varias páginas, cada una con botones en los mismos lugares y con las mismas propiedades. Cada página también tiene pequeñas diferencias. Con ese fin, creamos una plantilla de control de usuario y colocamos todos los botones en ella, luego aplicamos ese control de usuario a todas las páginas. Sin embargo, ahora es bastante difícil acceder a los botones y modificarlos desde el xaml de cada página, porque están dentro de un UserControl en la página .....¿Cómo accedo elegantemente a los botones desde cada página?

Lo que probé:

Actualmente, nos unimos a un montón de propiedades de dependencia. No me gusta esta opción porque tengo muchos botones y necesito controlar muchas propiedades en esos botones. El resultado son cientos de propiedades de dependencia, y un verdadero desastre para atravesar cuando necesitamos cambiar algo.

Otro método es usar estilos. En general, me gusta este método, pero debido a que estos botones están dentro de otro control, resulta difícil modificarlos, y la plantilla solo sería exactamente correcta para un botón, a la vez.

Adam Kemp publicó sobre dejar que el usuario simplemente inserte su propio botónaquí, y este es el método que estoy tratando de implicar / modificar actualmente. Lamentablemente, no tengo acceso a Xamarin.

Aunque la plantillaes insertado cuando se ejecuta el código, la plantillano es actualizando el botón correctamente. Si pongo un punto de interrupción en MyButton Setter, puedo ver quevalor en realidad es un botón vacío, en lugar del que asigné en mi ventana principal. ¿Cómo puedo solucionar esto?

Aquí hay un código simplificado:

Mi plantilla 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>

El código de My Template UserControl detrás:

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
            }
        }
    }
}

Y ahora la aplicación donde quiero usarla:

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

Y ahora el código detrás:

Using System.Windows;
Namespace TemplateCode
{
    Public partial class MainWindow : Window
    {
        Public MainWindow()
        {
            InitializeComponent();
        }
    }
}

Editar: Si bien quiero eliminar las propiedades de dependencia innecesarias en elmodelo userControl, todavía me gustaría establecer enlaces en elbotónLas propiedades de XAML.

Respuestas a la pregunta(6)

Su respuesta a la pregunta