WPF DataGrid Totals Row

时间:2018-03-22 11:38:00

标签: wpf

我有一个简单的Datagrid,我想在Datagrid的底部显示一个Totals行。我知道有很多方法可以做到这一点,但我选择在底部有第二个DataGrid来保存Column Totals。 Top(主)DataGrid将绑定到某些数据表,而具有一行的底部(Total DataGrid)将绑定到我将使用某个公式生成的数据表列总数。

我想要做的事情的魔力是每当我重新排列顶部的列位置时,底部的列也应该相应地重新排列。同样,如果我在Top DataGrid上更改Column宽度,则底部列宽也应相应更改。

  1. 调整底部宽度似乎很容易,因为我使用了第1列的示例:Width="{Binding Source={x:Reference Column1}, Path=ActualWidth}",如下所示使用了XAML绑定。我选择x:Reference的原因是(我被告知)除了使用x引用之外,没有简单的方法可以引用DataGrid列名(假设这是真的)。我注意到上面的宽度绑定带有下划线,表示虽然在运行时它仍然可以识别绑定。

  2. 将底部DataGrid的列位置与顶部DataGrid的列位置同步,只能在后面的代码中完成,如下所示: {{1 }} 不起作用并冻结应用程序。

  3. 我有两个问题:

    1. 如何更改上面的XAML以使绑定更快?
    2. 如何使用XAML绑定来处理列索引(位置)中的任何更改而不使用后面的代码?
    3. 这是XAML和背后的c#代码

      DisplayIndex="{Binding Source={x:Reference Column1}, Path=Actual DisplayIndex }"

      以下是调节列索引(位置)

      中任何更改的代码
      <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525">
          <Grid  >
              <Grid.RowDefinitions>
                  <RowDefinition Height="273*" />
                  <RowDefinition Height="60" />
              </Grid.RowDefinitions>
              <DataGrid x:Name="TopDataGrid" ColumnDisplayIndexChanged="TopDataGrid_ColumnDisplayIndex">
                  <DataGrid.Columns>
                      <DataGridTextColumn x:Name="Column1" Header="Column 1" Width="*" />
                      <DataGridTextColumn x:Name="Column2" Header="Column 2" Width="3*" />
                      <DataGridTextColumn x:Name="Column3" Header="Column 3" Width="*" />
                      <DataGridTextColumn x:Name="Column4" Header="Column 4" Width="*" />
                  </DataGrid.Columns>
              </DataGrid>
              <DataGrid x:Name="BottomDataGrid" Grid.Row="1">
                  <DataGrid.Columns>
                      <DataGridTextColumn  x:Name="TotalColumn1" Header="Total Column 1" Width="{Binding Source={x:Reference Column1}, Path=ActualWidth}"  />
                      <DataGridTextColumn x:Name="TotalColumn2" Header="Total Column 2" Width="{Binding Source={x:Reference Column2}, Path=ActualWidth}" />
                      <DataGridTextColumn x:Name="TotalColumn3" Header="Total Column 3" Width="{Binding Source={x:Reference Column3}, Path=ActualWidth}" />
                      <DataGridTextColumn x:Name="TotalColumn4" Header="Total Column 4" Width="{Binding Source={x:Reference Column4}, Path=ActualWidth}" />
                  </DataGrid.Columns>
              </DataGrid>
          </Grid>
      </Window>
      

      就像我说的那样,我确信还有其他(甚至更好)的方式来做我想要实现的目标。但在你提出其他方法之前,请帮我解决这个问题。

      我们当中有70亿人肯定有人可以解决这个问题。我们不需要UFO来解决它!!!!!

1 个答案:

答案 0 :(得分:0)

初始化列后,您可以以编程方式绑定到DisplayIndex属性:

public MainWindow()
{
    InitializeComponent();
    ...
    Loaded += (s, e) =>
    {
        BindingOperations.SetBinding(TotalColumn1, DataGridColumn.DisplayIndexProperty, new Binding("DisplayIndex") { Source = Column1 });
    };
}