Привязка в заголовке GroupStyle не обновляется при изменении коллекции

У меня есть ItemsControl который связан с CollectionViewSource привязан к свойству в модели представления.

ItemsControl имеет GroupStyle набор, который выглядит так:

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

куда TotalDurationTemplate является:

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

Проблема в том, что второй TextBlock (тот, который связан с Items) не переоценивается, когда новый элемент добавляется в коллекцию модели представления (которая является ObservableCollection<>). Элемент добавлен в ListView в правильную группу, но значение общей продолжительности не обновляется.

Конвертер для общей длительности выглядит так:

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();
    }
}

Как сделать так, чтобы привязка обновлялась правильно при изменении элементов в модели представления?

РЕДАКТИРОВАТЬ: Решение

Я взял Решение 2 из принятого ответа и вставил его в свой код. Вот что получилось:

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

И меняется TotalDurationConverter в IMultiValueConverter, Просто игнорируйте второй пункт в Array,

1 ответ

Решение

Итак, две возможности, и если вы можете попробовать ниже простые решения и дайте мне знать, если это работает.

Решение 1 - очень простое и простое, так как вы используете textbloxk, явно установите режим Two way. Я предполагаю, что режим привязки по умолчанию для TextBlock - One way

Решение 2. Я столкнулся с аналогичной проблемой при работе со списком. Вот работа, которая сработала для меня. Для второго текстового блока используйте Multi Binding, сначала свяжите его со списком, как вы уже сделали, во-вторых, свяжите его с любым свойством в Просмотр модели, которая будет срабатывать при изменении вашего списка (например, свойство int, возвращающее List.Count). Это второе фиктивное свойство обеспечит повторную оценку вашего конвертера.

Я думаю, что второй вариант должен работать для вас.

Дайте мне знать, если это не сработает.

С уважением, Вишал

Другие вопросы по тегам