从DataTemplate更新绑定

时间:2012-08-10 15:43:41

标签: wpf binding datatemplate

我有一个带有DataGrid的WPF,我对行进行分组(在示例中为“Name”)。我有一个每个组的摘要行(“名称”和我在转换器中计算的总数“金额”)。 问题是我需要强制对摘要行进行绑定更新,但我无法在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>

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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