Comment mettre à jour une étiquette qui se trouve dans un ControlTemplate d'une barre d'outils dans WPF?

StackOverflow https://stackoverflow.com/questions/222052

  •  03-07-2019
  •  | 
  •  

Question

J'ai un ControlTemplate composé d'une ToolBarTray et d'une ToolBar. Dans ma barre d'outils, j'ai plusieurs boutons, puis une étiquette. Je souhaite pouvoir mettre à jour l’étiquette dans ma barre d’outils avec le code "1 sur 10".

Ma première pensée est de rechercher et d’établir l’étiquette par programme, mais je lis que cela devrait être fait avec les déclencheurs. J'ai du mal à comprendre comment accomplir cela. Des idées?

   <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"  .. />
Était-ce utile?

La solution

Le but d'un ControlTemplate est de définir l'apparence d'un contrôle. Pour votre problème, je ne sais pas si un modèle de contrôle est la bonne solution.

Comme Bryan le fait également remarquer, vous devez lier la propriété Contenu de l’étiquette à une propriété déjà présente dans votre contrôle. Cela devrait être fait via TemplateBinding .

<Label x:Name="myStatusLabel" Content={TemplateBinding MyStatusLabelProperty} ../>

La propriété MyStatusLabelProperty doit alors exister dans votre classe de contrôle. En général, vous créez votre propre UserControl qui possède une propriété de dépendance du type correct (objet ou chaîne) nommée MyStatusLabelProperty.

Autres conseils

Je définirais l'étiquette sur le "Contenu". attribut de votre contrôle, par exemple.

<Label x:Name="myStatusLabel"  Content="{TemplateBinding Content}"/>

Vous pouvez ensuite définir le texte de votre étiquette avec l'attribut Content de votre objet de niveau supérieur.

Je voudrais créer un modèle de vue qui implémente l'interface INotifyPropertyChanged et utiliser DataTemplate pour l'afficher à l'aide de quelque chose comme ceci:

<DataTemplate DataType={x:Type viewmodel:MyToolBarViewModel}>
    <Label Content={Binding CurrentPage} />
    <Label Content={Binding TotalPages} ContentStringFormat="{}of {0}" />
</DataTemplate>

<ToolBar>
    <ContentPresenter Content={Binding <PathtoViewModel>} />
</ToolBar>

Avec l'utilisation de liaisons, il n'est pas nécessaire de mettre à jour explicitement le contenu de l'étiquette. Tout ce que vous avez à faire est de définir la valeur de la propriété dans le modèle de vue et de générer l'événement PropertyChanged approprié qui force le libellé à mettre à jour son contenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top