我有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>
问题是,当一个新项目被添加到View Model的集合中时,不会重新评估第二个TextBlock
(绑定到Items
的那个)(这是一个{ {1}})。该项目已添加到ObservableCollection<>
到正确的组中,但总持续时间值未更新。
转换器总持续时间如下所示:
ListView
如果更改了视图模型中的项目,如何正确刷新绑定?
编辑:解决方案
我从接受的答案中提取了解决方案2并将其放入我的代码中。这就是最终的工作:
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();
}
}
将<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
中的第二项。
答案 0 :(得分:1)
所以有两种可能性,如果您可以尝试以下简单的解决方案,请告诉我它是否有效。
解决方案1 - 一个非常简单和基本的解决方案,因为您正在使用textbloxk将模式明确设置为双向。我猜TextBlock默认绑定模式是单向的。
解决方案2 - 我在使用组合框时遇到过类似的问题 - 这是一个为我工作的工作 对于第二个Text块,使用Multi Binding,首先将它绑定到List,然后将它绑定到View Model中的任何属性,当你的列表被更改时将触发它(例如,一个int属性返回List.Count) - 第二个虚拟属性将确保重新评估转换器。
我猜第二个选项对你有用。
如果它不起作用,请告诉我。
的问候, 维沙尔