次のように、テキストを変更するDataTriggerを持つスタイルを持つTextBoxがあります。
<Grid>
<TextBlock Text="Foo">
<TextBlock.Style>
<Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding MyBool}" Value="True">
<Setter Property="Text" Value="Bar"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
しかし、それは機能していません。テキストが「バー」に変わることはありません。 Text = "{Binding MyBool}"で別のTextBlockを使用してテストしたところ、このテキストが「False」から「True」に変更されました。スヌープは私が見ることができるエラーを明らかにせず、出力には何もありません。
この質問は MVVMプロパティへのWPFトリガーバインディング の重複のように見えるかもしれませんが、私のコードはそこで受け入れられた回答と異なっていないようです( http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF .aspx 、セクション「スタイルの使用」)、適切な方法で。そして、実際の答えで提案されているようにDataTemplateを使用すると、これを単一のTextBlockにのみ適用したいので間違っているように見えますが、それが正しい場合は、このためのDataTemplateの記述方法がわかりません...
編集:
これは、私がバインドしているプロパティは次のようになります。
public bool MyBool
{
get { return _myBool; }
set
{
if (_myBool== value)
return;
_myBool= value;
NotifyPropertyChanged();
}
}
private bool _myBool;
依存関係プロパティは、さまざまな場所から設定できます。インライン、アニメーション、強制、トリガーなど。 Dependency Property Value Precedence リストが作成され、これにより、どの変更が他のどの変更をオーバーライドするかが決まります。この優先順位のため、Trigger
を使用して、XAMLで明示的にインラインに設定されているプロパティを更新することはできません。代わりにこれを試してください:
<Grid>
<TextBlock>
<TextBlock.Style>
<Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock">
<!-- define your default value here -->
<Setter Property="Text" Value="Foo" />
<Style.Triggers>
<DataTrigger Binding="{Binding MyBool}" Value="True">
<!-- define your triggered value here -->
<Setter Property="Text" Value="Bar" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>