DataGrid Items 集合并不总是刷新

DataGrid Items collection doesn't always refresh

我有一个 DataGrid 绑定到一个 ObservableCollection<Client>。 我有一个 UserControl 负责从 Textbox 值对集合应用过滤器,如下所示:

private void UCFilterBox_SearchTextChanged(object sender, string e)
{
    var coll = CollectionViewSource.GetDefaultView(dgClients.ItemsSource);
    coll.Filter = o =>
    {
        var c = o as Client;
        if (c != null)
        {
            bool ret =  (the filter...)

            return ret;
        }
        else
        {
            return false;
        }
    };
}

然后我有一个 TextBlock 绑定到 DataGridItems 集合,如下所示:

<StackPanel Grid.Row="0"
            Margin="215,0,0,5"
            HorizontalAlignment="Left"
            VerticalAlignment="Bottom"
            Orientation="Horizontal">
    <TextBlock Style="{StaticResource SmallTextBlockStyle}" Text="{Binding ElementName=dgClients, Path=Items.Count}" />
    <TextBlock Style="{StaticResource SmallTextBlockStyle}" 
               Text="{Binding ElementName=dgClients, Path=Items.Count, Converter={StaticResource ClientSingleOrPluralConverter}, StringFormat={} {0}}" />
</StackPanel> 

这工作正常,每次过滤 DataGrid 时,值都会相应更改。

但是,我有另一个TextBlock绑定到DataGridItems集合,它负责显示显示数据的总和,而这个不更新!

<TextBlock Margin="5"
           FontWeight="Bold"
           Text="{Binding ElementName=dgClients,
                          Path=Items,
                          Converter={StaticResource CalculateSumConvertor},
                          StringFormat={}{0:C}}" />

CalculateSumConvertor 仅在 DataGrid 的绑定处被击中一次,然后不再被击中。

这是转换器:

public class CalculateSumConvertor: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var clients = value as ItemCollection;

        if (clients != null)
        {
            return clients.Cast<Client>().Sum(c => c.FieldToSum);
        }
        else
        {
            return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我是不是做错了什么?

将您的绑定更改为以下内容并将您的转换器更改为 IMultiValueConverter

    <TextBlock Margin="5"
       FontWeight="Bold">
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource CalculateSumConvertor}" StringFormat="{}{0:C}">
                <Binding ElementName="dgClients" Path="Items" />
                <Binding ElementName="dgClients" Path="Items.Count" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>

转换器:

class CalculateSumConvertor : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var clients = values[0] as ItemCollection;
        ...
    }




}