【发布时间】:2016-07-07 04:44:42
【问题描述】:
我有一个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 到正确的组中,但 Total Duration 值未更新。
总时长转换器如下所示:
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 中的第二项即可。
【问题讨论】:
标签: c# wpf mvvm groupstyle