[元の]
データがにバインドされ
てListBox
いるItemsSource
(これは、ウィンドウが作成されるときにコードビハインドで行われます)ObservableCollection
。次に、アイテムに対してListBox
以下がDataTemplate
割り当てられます。
usercontrol.xaml
<ListBox x:Name="communicatorListPhoneControls"
ItemContainerStyle="{StaticResource templateForCalls}"/>
app.xaml
<Style x:Key="templateForCalls" TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource templateRinging}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource templateAnswered}"/>
</DataTrigger>
</Style.Triggers>
</Setter>
</Style>
がObservableCollection
オブジェクトで更新されると、これListBox
は正しいイニシャルDataTemplate
でに表示されますが、hasBeenAnswered
プロパティがに設定されているtrue
場合(デバッグ時にコレクションが正しいことがわかります)、DataTrigger
は再評価されずListBox
、正しいを使用するように更新されますDataTemplate
。
オブジェクトにイベントを実装しINotifyPropertyChanged
ました。テンプレートで値にバインドされている場合は、値の更新を確認できます。それは、DataTrigger
が再評価されて正しいテンプレートに変更されないということだけです。
DataTrigger
ウィンドウを閉じて再度開くと、hasBeenAnswered
がに設定されているため、2番目のデータテンプレートが正しく適用されるため、バインディングが正しいことがわかりますtrue
。
[編集1]
Timoresによるコメントに続いて、私は次のことを試みました。
usercontrol.xaml
<ListBox x:Name="communicatorListPhoneControls"
ItemTemplate="{StaticResource communicatorCallTemplate}"/>`
app.xaml:
<DataTemplate x:Key="communicatorCallTemplate">
<Label x:Name="test">Not answered</Label>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter TargetName="test" Property="Background" Value="Blue"/>
</DataTrigger>
</DataTemplate.Triggers>
</Label>
</DataTemplate>
ここで発生するのは最初の例と同様です。「未応答」ラベルに電話がかかってくると(これはリストボックスであるため、電話ごとに1つあります。通常、ウィンドウが読み込まれると電話はありません)、電話は次のようになります。回答済みで、プロパティhasBeenAnswered
はtrueに設定されていますが、「未回答」は同じままです。ウィンドウを閉じて再度開くと(プロパティhasBeenAnsweredがtrueに設定されたままのアクティブな呼び出しで)、背景は青色になります。したがって、ウィンドウが再実行されるまで、データトリガーは単に実行されていないように見えます。