[Original]
verändert habe ich ein ListBox
die ihren ItemsSource
hat (dies hinter dem Code erfolgt auf als das Fenster erstellt wird) zu einem ObservableCollection
Databound. Die ListBox
hat dann die folgende DataTemplate
gegen den Positionen zugeordnet:Datatrigger nicht neu zu bewerten nach Immobilien
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>
Wenn die ObservableCollection
mit einem Objekt aktualisiert wird, erscheint diese in der ListBox
mit der richtigen Initiale DataTemplate
, aber wenn die hasBeenAnswered
Eigenschaft auf true
eingestellt ist (beim Debuggen kann ich sehen Die Sammlung ist korrekt) Die DataTrigger
wird nicht neu bewertet und aktualisiert dann die ListBox
, um die richtige DataTemplate
zu verwenden.
Ich habe das INotifyPropertyChanged
Event in meinem Objekt implementiert, und wenn in der Vorlage an einen Wert gebunden ist, kann ich den Wert aktualisieren. Es ist nur, dass die DataTrigger
nicht neu bewerten und auf die richtige Vorlage ändern.
Ich weiß, dass die DataTrigger
Bindung weil korrekt ist, wenn ich das Fenster zu schließen und wieder öffnen, wird es richtig das zweite Datatemplate anwenden, weil die hasBeenAnswered
auf true
gesetzt.
[bearbeiten 1]
Im Anschluss an Kommentare zu made by Timores habe ich versucht, die folgenden:
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>
Was jetzt passiert ist ähnlich wie im ersten Beispiel, wenn ein Anruf in der "Nicht beantwortet" -Label angezeigt wird (eine pro Anruf, die existiert, da dies eine Listbox ist - normalerweise wird das Fenster geladen, wenn keine Anrufe getätigt werden), der Anruf wird dann beantwortet und die Zentrale hasBeenAnswered
wird auf "true" gesetzt, doch das "Not Answered" bleibt gleich. Wenn ich das Fenster schließe und es erneut öffne (wobei der aktive Aufruf immer noch mit der Eigenschaft hasBeenAnswered auf true gesetzt ist), ist der Hintergrund blau. Es scheint mir also, als ob der Datentrigger einfach nicht ausgeführt wird, bis das Fenster erneut ausgeführt wird.
Ich habe versucht, dies zu implementieren, aber es gilt immer noch nur, wenn ich das Fenster schließe und es erneut öffne. Ich werde den ursprünglichen Kommentar verbessern, um dies zu zeigen. Hast du eine Idee? –
AHHHHH! Ich habe es, meine eigene dumme Schreibweise, du warst richtig, in der INotifyProperyChanged hatte ich "hasBeenAsnwered" anstelle von "hasBeenAnswered". private Boolean _hasBeenAnswered; public Boolean hasBeenAnswered { erhalten {return _hasBeenAnswered; } set { _hasBeenAnswered = Wert; NotifyPropertyChanged ("hasBeenAnswered"); } } } vielen Dank für Ihre Hilfe. –
Gern geschehen. Aber ich war ursprünglich falsch, d. H. Der DataContext im ItemContainerStyle ist wirklich das Element innerhalb, nicht das ListBoxItem. Ich habe mein Beispiel so geändert, dass es mehr wie deine ursprüngliche Frage ist, und es funktioniert auch. – Timores