2010-03-12 9 views
5

[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.

Antwort

1

Was mir im Beispiel seltsam erscheint, ist, dass Sie einen ItemContainerStyle anstelle eines ItemTemplate verwenden.

ItemContainerStyle gilt für das ListBoxItem, das jedes Element in Ihrer ItemsSource enthält. Das ListboxItem hat keine hasBeenAnswered-Eigenschaft, so dass ich nicht sehe, wie die Bindung funktionieren könnte.

Ich empfehle das Erstellen einer DataTemplate für den Datentyp in Ihrer List-Box und die Verwendung von Triggern, um die gleichen Änderungen wie in Ihrem templateAnswered Stil vorzunehmen.

Edit: nachdem OP den Vorschlag des ItemTemplate verwendet.

Ich habe versucht, das Beispiel zu reproduzieren, und es funktioniert gut für mich. Hier ist meine XAML (bitte Stil außer Acht lassen, dies ist nur ein Beispiel):

Nicht

<ListBox x:Name="communicatorListPhoneControls" 
      ItemTemplate="{StaticResource communicatorCallTemplate}"/> 

    <Button Margin="0,20,0,0" Click="OnToggleAnswer" Content="Toggle answer status" /> 
</StackPanel> 

Und in der Code- beantwortet hinten:

Können Sie versuchen, dies zu reproduzieren und mit Ihrem Code zu vergleichen? Hinweis: Der kleinste Fehler im Eigenschaftsnamen von PropertyChanged könnte Ihr Verhalten erklären. Der Auslöser könnte auf der richtigen Eigenschaft basieren, aber die Benachrichtigung könnte einen falsch geschriebenen Namen haben.

+0

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? –

+0

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. –

+0

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