1

我有一个带有 DataGrid 的 WPF,我对行进行分组(在示例中按“名称”)。我有每个组的摘要行(“名称”和我在转换器中计算的总“金额”)。问题是我需要强制对摘要行进行绑定更新,但我无法在 DataTemplate 中访问它。

<DataGrid ItemsSource="{Binding Source={StaticResource posCurrencyOpen}}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Amount"  Binding="{Binding Amount, Converter {StaticResource Amount_Converter}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
    </DataGrid.Columns>
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <DataGridCell Content="{Binding Path=Name}"/>
                        <DataGridCell Content="{Binding Path=Items, Converter={StaticResource AmountGroup_Converter}, Mode=OneWay}"/>
                    </StackPanel>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

非常感谢您的帮助。

4

2 回答 2

2

以下是我的处理方法:我有一个 Parent 对象,其中包含按日期分组的 Child 对象。每个孩子也有一个分配百分比属性(Pct)。我想按日期分组并显示 Pct 字段的小计,以便用户可以确保它们总计为 100%。我在每个子对象上插入了一个 TotalPct 属性,然后强制子对象为具有相同日期的所有子对象触发 PropertyChanged 事件。

    public partial class Child: INotifyPropertyChanged
    {

    public double TotalPct
    {
        get
        {
            double ttl = 0;
            if (Parent != null)
            {
                var peers = from d in Parent.Children where d.StartDate == StartDate select d;
                foreach (Child dtl in peers)
                {
                    ttl += dtl.Pct;
                }
            }
            return ttl;
        }
    }

    partial void OnPctChanged()
    {
        if (Parent != null)
        {
            var peers = from d in Parent.Children where d.StartDate == StartDate select d;
            foreach (Child dtl in peers)
            {
                NotifyPropertyChanged("TotalPct");
            }
        }
    }

然后我的 GroupStyle 将标题绑定到 itemcollection 中第一个 Child 的 TotalPct 属性:

    <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <cust:DataGrouper>
                        <cust:DataGrouper.Header>
                            <StackPanel Orientation="Horizontal" >
                                <TextBlock Text="{Binding Path=Name, StringFormat='MM/dd//yyyy'}"    
                                           Width="{Binding ElementName=detailsDataGrid, Path=Columns[0].ActualWidth}"/>
                                <TextBlock Text="" Width="{Binding ElementName=detailsDataGrid, Path=Columns[1].ActualWidth}" Margin="-20,0,0,0"/>
                                <TextBlock Text="" Width="{Binding ElementName=detailsDataGrid, Path=Columns[2].ActualWidth}" />
                                <TextBlock Text="{Binding Path=Items[0].TotalPct, Converter={StaticResource percentStringToDouble}, ConverterParameter=2}" HorizontalAlignment="Right"
                                           Width="{Binding ElementName=detailsDataGrid, Path=Columns[3].ActualWidth}"/>
                            </StackPanel>
                        </cust:DataGrouper.Header>
                        <ItemsPresenter />
                    </cust:DataGrouper>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
于 2012-09-13T17:51:28.290 回答
0

我认为您需要在您的 ICollectionView 对象上调用 Refresh() 。

于 2012-08-13T13:23:42.220 回答