Привязка в заголовке 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). Это второе фиктивное свойство обеспечит повторную оценку вашего конвертера.
Я думаю, что второй вариант должен работать для вас.
Дайте мне знать, если это не сработает.
С уважением, Вишал