Como acessar botões dentro de um UserControl do xaml?
No trabalho, tenho várias páginas, cada uma com botões nos mesmos lugares e com as mesmas propriedades. Cada página também possui pequenas diferenças. Para isso, criamos um modelo userControl e colocamos todos os botões nele, depois aplicamos esse controle de usuário a todas as páginas. No entanto, agora é bastante difícil acessar os botões e modificá-los no xaml de cada página, porque eles estão dentro de um UserControl na página ...Como acesso elegantemente os botões de cada página?
O que eu tentei:
Atualmente, vinculamos a várias propriedades de dependência. Não gosto dessa opção porque tenho muitos botões e preciso controlar muitas propriedades desses botões. O resultado são centenas de propriedades de dependência e uma verdadeira bagunça para percorrer quando precisamos mudar alguma coisa.
Outro método é usar estilos. Eu gosto desse método geralmente, mas como esses botões estão dentro de outro controle, torna-se difícil modificá-los, e o modelo seria exatamente correto para um botão, ao mesmo tempo.
Adam Kemp postou sobre permitir que o usuário insira seu próprio botãoaqui, e este é o método que estou tentando implementar / modificar. Infelizmente, não tenho acesso ao Xamarin.
Embora o modeloé inserido quando o código é executado, o modelonão é atualizando o botão corretamente. Se eu colocar um ponto de interrupção no MyButton Setter, posso ver quevalor é na verdade um botão vazio, e não o que eu designei na minha janela principal. Como faço para corrigir isso?
Aqui está um código simplificado:
Meu modelo xaml de UserControl:
<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>
O meu modelo UserControl's Code Behind:
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
}
}
}
}
E agora o aplicativo onde eu quero usá-lo:
<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>
E agora o código por trás:
Using System.Windows;
Namespace TemplateCode
{
Public partial class MainWindow : Window
{
Public MainWindow()
{
InitializeComponent();
}
}
}
Editar: Embora eu queira remover propriedades de dependência desnecessárias no diretóriomodelo userControl, eu ainda gostaria de definir ligações nobotãopropriedades do XAML.