2016-07-07 4 views
3

Ich habe eine ItemsControl, die an eine CollectionViewSource gebunden an eine Eigenschaft auf dem View-Modell gebunden ist.Bindung in GroupStyle-Header nicht aktualisiert, wenn die Sammlung ändert

Die ItemsControl hat ein GroupStyle Set, das wie folgt aussieht:

<GroupStyle HeaderTemplate="{StaticResource TotalDurationTemplate}" /> 

Wo TotalDurationTemplate ist:

<DataTemplate x:Key="TotalDurationTemplate"> 
    <Border BorderBrush="Black" BorderThickness="0 1" Background="#EEE"> 
     <Grid> 
      <TextBlock HorizontalAlignment="Center" 
              FontSize="18" FontWeight="Bold" 
              Text="{Binding Path=Items[0].Start, Converter={StaticResource DateTimeFormatConverter}, ConverterParameter='ddd dd/MM'}" /> 
      <TextBlock Margin="10 0" HorizontalAlignment="Right" VerticalAlignment="Center" 
              FontSize="16" Foreground="#9000" 
              Text="{Binding Items, Converter={StaticResource TotalDurationConverter}}" /> 
     </Grid> 
    </Border> 
</DataTemplate> 

Das Problem ist, dass die zweiten TextBlock (die zu Items gebunden) ist nicht neu -bewertet, wenn ein neues Element zur Sammlung des Ansichtsmodells hinzugefügt wird (ObservableCollection<>). Das Element wird zu ListView in der richtigen Gruppe hinzugefügt, aber der Gesamtdauerwert wird nicht aktualisiert.

Der Konverter für Gesamtdauer sieht wie folgt aus:

public class TotalDurationConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return 
      ((IEnumerable<object>)value) 
       .Select(x => ((RecentTimingViewModel)x).Duration) 
       .Aggregate((v1, v2) => v1 + v2) 
       .TotalHours 
       .ToString("F2") + "h"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new InvalidOperationException(); 
    } 
} 

Wie kann ich die Bindung refresh machen richtig, wenn die Elemente in der Ansicht Modell geändert werden?

EDIT: Die Lösung

Ich nahm Lösung 2 aus der Antwort akzeptiert und es in meinen Code. Dies ist, was am Ende arbeiten:

<DataTemplate x:Key="TotalDurationTemplate"> 
    <Border BorderBrush="Black" BorderThickness="0 1" Background="#EEE"> 
     <Grid> 
      <TextBlock HorizontalAlignment="Center" 
         FontSize="18" FontWeight="Bold" 
         Text="{Binding Path=Items[0].Start, Converter={StaticResource FormatDateIntelligentConverter}}" /> 
      <TextBlock Margin="10 0" HorizontalAlignment="Right" VerticalAlignment="Center" 
         FontSize="16" Foreground="#9000"> 
       <TextBlock.Text> 
        <MultiBinding Converter="{StaticResource TotalDurationConverter}"> 
         <MultiBinding.Bindings> 
          <Binding Path="Items" /> 
          <Binding Path="Items.Count" /> 
         </MultiBinding.Bindings> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </Grid> 
    </Border> 
</DataTemplate> 

Und TotalDurationConverter-IMultiValueConverter ändern. Die ignorieren einfach den zweiten Artikel in der Array.

Antwort

1

Also zwei Möglichkeiten und wenn Sie unten einfache Lösungen versuchen können und lassen Sie mich wissen, wenn es funktioniert.

Lösung 1 - eine sehr einfache und grundlegende, da Sie eine Textbloxk verwenden, legen Sie den Modus explizit auf Zwei-Wege. Ich schätze TextBlock Standard Binding-Modus ist eine Möglichkeit.

Lösung 2 - Ich habe konfrontiert ähnliches Problem mit einer Combo arbeitet hier Box- ist ein Werk, um die für mich gearbeitet Für die zweite Textblock Verwendung Multi Binding, erster binden, wie Sie es bereits getan haben, zur Liste, Zweitens binden Sie es an eine beliebige Eigenschaft in View Model, die ausgelöst wird, wenn Ihre Liste geändert wird (Beispiel: eine int-Eigenschaft, die List.Count zurückgibt). Diese zweite Dummy-Eigenschaft stellt sicher, dass Ihr Konverter erneut ausgewertet wird.

Ich denke, zweite Option sollte für Sie arbeiten.

Lassen Sie mich wissen, wenn es nicht funktioniert.

Grüßen, Vishal

+0

Ja nach der Arbeit zu verlassen ich in einem Multibinding zum List.Count der Quellenliste gedacht zu binden. Werde es morgen versuchen und sehen, wie es geht. –

+0

Cool, es hat für mich in einem der Szenarien gearbeitet ... lass es mich wissen, wenn es funktioniert. Alles Gute :) –

Verwandte Themen