集合更改时,GroupStyle标头中的绑定不会更新

时间:2016-07-07 04:44:43

标签: c# wpf mvvm 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>

问题是,当一个新项目被添加到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中的第二项。

1 个答案:

答案 0 :(得分:1)

所以有两种可能性,如果您可以尝试以下简单的解决方案,请告诉我它是否有效。

解决方案1 ​​ - 一个非常简单和基本的解决方案,因为您正在使用textbloxk将模式明确设置为双向。我猜TextBlock默认绑定模式是单向的。

解决方案2 - 我在使用组合框时遇到过类似的问题 - 这是一个为我工作的工作  对于第二个Text块,使用Multi Binding,首先将它绑定到List,然后将它绑定到View Model中的任何属性,当你的列表被更改时将触发它(例如,一个int属性返回List.Count) - 第二个虚拟属性将确保重新评估转换器。

我猜第二个选项对你有用。

如果它不起作用,请告诉我。

的问候, 维沙尔