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
.
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. –
Cool, es hat für mich in einem der Szenarien gearbeitet ... lass es mich wissen, wenn es funktioniert. Alles Gute :) –