WPFのツールバーのControlTemplateにあるラベルを更新するにはどうすればよいですか?
-
03-07-2019 - |
質問
ToolBarTrayとToolBarで構成されるControlTemplateがあります。私のツールバーには、いくつかのボタンとラベルがあります。ツールバーのラベルを「1 of 10」のように更新できるようにしたい
最初に考えたのは、プログラムでラベルを見つけて設定することですが、これはTriggersで行うべきだと読んでいます。私はこれを達成する方法を理解するのに苦労しています。アイデアはありますか?
<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" .. />
解決
ControlTemplateの目的は、コントロールの外観を定義することです。あなたの問題については、コントロールテンプレートが適切なソリューションであるかどうかはわかりません。
Bryanも指摘しているように、Labelの Content プロパティを、コントロールに既に存在するプロパティにバインドする必要があります。これは、 TemplateBinding を介して行う必要があります。
<Label x:Name="myStatusLabel" Content={TemplateBinding MyStatusLabelProperty} ../>
プロパティ MyStatusLabelProperty は、コントロールクラスに存在する必要があります。 通常、MyStatusLabelPropertyという名前の正しいタイプ(オブジェクトまたは文字列)の依存関係プロパティを持つ独自の UserControl を作成します。
他のヒント
ラベルを&quot; Content&quot;に設定しますコントロールの属性(例:
)<Label x:Name="myStatusLabel" Content="{TemplateBinding Content}"/>
次に、トップレベルオブジェクトのContent属性でラベルのテキストを設定できます。
私はINotifyPropertyChangedインターフェイスを実装するビューモデルを作成し、DataTemplateを使用して次のようなものを使用して表示します。
<DataTemplate DataType={x:Type viewmodel:MyToolBarViewModel}>
<Label Content={Binding CurrentPage} />
<Label Content={Binding TotalPages} ContentStringFormat="{}of {0}" />
</DataTemplate>
<ToolBar>
<ContentPresenter Content={Binding <PathtoViewModel>} />
</ToolBar>
バインディングを使用すると、ラベルのコンテンツを明示的に更新する必要はありません。必要なことは、ビューモデルでプロパティの値を設定し、適切なPropertyChangedイベントを発生させるだけです。これにより、ラベルのコンテンツが更新されます。