Como faço para atualizar um rótulo que está em um ControlTemplate de uma barra de ferramentas no WPF?
-
03-07-2019 - |
Pergunta
Eu tenho um ControlTemplate que é composta de um ToolBarTray e uma barra de ferramentas. Na minha barra de ferramentas, eu tenho vários botões e, em seguida, um rótulo. Eu quero ser capaz de atualizar o rótulo na minha barra de ferramentas com algo como "1 de 10"
Meu primeiro pensamento é encontrar programaticamente o rótulo e defini-lo, mas eu estou lendo que isso deve ser feito com gatilhos. Estou tendo dificuldade em entender como fazer isso. Alguma idéia?
<Style x:Key="DocViewerToolBarStyle" TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<ToolBarTray... />
<ToolBar.../>
<Button../>
<Button..>
<Label x:Name="myStatusLabel" .. />
Solução
O propósito de um ControlTemplate é definir a aparência de um controle. Para o seu problema, eu não tenho certeza se um modelo de controle é a solução certa.
Como Bryan também aponta, você deve vincular o conteúdo do rótulo para uma propriedade que já está presente em seu controle. Isto deve ser feito através de TemplateBinding .
<Label x:Name="myStatusLabel" Content={TemplateBinding MyStatusLabelProperty} ../>
A propriedade MyStatusLabelProperty , então tem de existir em sua classe de controle. Normalmente, você deve criar seu próprio UserControl que tem uma propriedade de dependência do tipo correto (ou objeto ou string) que é nomeado MyStatusLabelProperty.
Outras dicas
Gostaria de definir o rótulo para o atributo "Conteúdo" de seu controle por exemplo.
<Label x:Name="myStatusLabel" Content="{TemplateBinding Content}"/>
Em seguida, você pode definir o texto da sua etiqueta com o atributo conteúdo do seu objeto de nível superior.
Gostaria de criar um modelo de vista que implementa INotifyPropertyChanged interface e usar DataTemplate para exibi-lo usando algo parecido com isto:
<DataTemplate DataType={x:Type viewmodel:MyToolBarViewModel}>
<Label Content={Binding CurrentPage} />
<Label Content={Binding TotalPages} ContentStringFormat="{}of {0}" />
</DataTemplate>
<ToolBar>
<ContentPresenter Content={Binding <PathtoViewModel>} />
</ToolBar>
Com usando ligações que você não tem que explicitamente atualizar o conteúdo do rótulo. Tudo que você tem a fazer é valor ajustado de propriedade no modelo de vista e aumento adequada PropertyChanged evento que faz com que o rótulo para atualizar seu conteúdo.