Группировка данных WPF и итоги строк с использованием DataSet - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу реализовать группировку WPF DataGrid. Большинство примеров, которые я видел, имеют дело с Observablecollection, и это работает. Однако моя проблема в том, что я использую DataSet, и мой CollectionViewSource подключен к DataSet.

Я пробовал в соответствии с приведенным ниже примером, и это похоже на работу. Однако, что касается Суммирование строк , преобразователь получает только первую запись и не суммирует, начиная со второй записи и далее. Что мне не хватает? Еще раз я НЕ использую Observablecollection, но старомодный DataSet.

Вот XAML

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1" x:Class="MainWindow"
    Title="MainWindow" Height="350" Width="325">
    <Window.Resources>
        <local:SuTotals x:Key="SuTotals"/>
        <local:DataSet1 x:Key="DataSet1"/>
        <CollectionViewSource x:Key="SalesViewSource" Source="{Binding Sales, Source={StaticResource DataSet1}}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Description" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <Grid>
        <DataGrid  x:Name="SalesDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource SalesViewSource}}"  RowDetailsVisibilityMode="VisibleWhenSelected" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="Column1" IsReadOnly="True" Binding="{Binding Description}" Header="Description" Width="*"/>
                <DataGridTextColumn x:Name="Column2" Binding="{Binding Amount, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Header="Amount" Width="100"/>
            </DataGrid.Columns>
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander IsExpanded="true" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">
                                            <Expander.Header>
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="{Binding ElementName=Column1, Path=ActualWidth}"/>
                                                        <ColumnDefinition Width="{Binding ElementName=Column2, Path=ActualWidth}"/>
                                                    </Grid.ColumnDefinitions>
                                                    <StackPanel Orientation="Horizontal">
                                                        <TextBlock Grid.Column="0" Text="Total: " FontWeight="Bold" Margin="0,0,15,0" TextAlignment="Right"/>
                                                        <TextBlock Grid.Column="1" Text="{Binding Path=ItemCount}"  Margin="0,0,15,0" TextAlignment="Right"/>
                                                    </StackPanel>
                                                    <TextBlock Grid.Column="1" Text="{Binding Path=Items, Converter={StaticResource SuTotals}, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"  Margin="0,0,15,0" TextAlignment="Center"/>
                                                </Grid>
                                            </Expander.Header>
                                            <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>
    </Grid>
</Window>

Вот код позади:

VB.NET

Public Class SuTotals
    Implements IValueConverter


    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert

        Dim rows As IEnumerable(Of Object) = CType(value, IEnumerable(Of Object))
        Dim c As Integer = 0

        For Each item As Object In rows
            c += item("Amount")
        Next

        Return c

    End Function

    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class

C #

public class SuTotals : IValueConverter
{
    public object IValueConverter.Convert(object value, Type targetType, object parameter, Globalization.CultureInfo culture)
    {
        IEnumerable<object> rows = (IEnumerable<object>)value;
        int c = 0;
        foreach (object item in rows) {
            c += item("Amount");
        }
        return c;
    }

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

DataSet называется DataSet1 , а таблица называется Sales . Он имеет 2 столбца: Описание в виде строки и Сумма в виде Double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...