显示行索引并重置排序

时间:2014-11-12 12:42:50

标签: c# wpf sorting datagrid

我是WPF-noob并且有两个DataGrid问题:

问题1:

我得到了什么: 从数组中获取数据的DataGird:

 <DataGrid x:Name="dgMain" ItemsSource="{Binding TestArray}" Margin="0,20,0,0" LoadingRow="dgMain_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
            </DataGrid.Columns>
 </DataGrid>

我正在使用&#34; LoadingRow&#34;更新行标题的事件:

private void dgMain_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        e.Row.Header = (e.Row.GetIndex() + 1).ToString();
    }

我想要的是什么: 它应该显示行标题中行的索引。

问题是什么?:如果我添加项目或加载项目效果很好,但如果我对DataGird进行排序,那么行的索引就不会改变。

unsorted sorted

左边的是未分类的,右边的是按名称排序的。在这个例子中,线的索引&#34; F&#34;应该是6而不是1(右图)。

(与问题无关:为什么选择所有RowHeaders?)

问题2:

我得到了什么: 请参阅问题1

我想要的是什么:我添加了一行后,它应该跳转到下一个空行。

问题是什么?:如果我对数据网格进行排序,它会跳转到下一行,即使它不是空的。

monkey

首先,我按名称对列表进行了排序,然后添加了&#34; A:第一个&#34;,&#34; B:第二个&#34;,&#34; C:第三个&#34;然后&#34; A:第四&#34;并且由于排序&#34; A:第四&#34;自动获取第二行,然后跳转到第三行而不是最后一行空行。

编辑抱歉,我忘了说:它应该1.重置排序并且2.跳到最后一个空行。订单应该是&#34; A:第一&#34;,&#34; B:S&#34;,&#34; C:T&#34;和&#34; A:第四&#34;。

我真的希望有简单的解决方案。谢谢:))

1 个答案:

答案 0 :(得分:1)

对于第一个问题,您必须创建自己的行标题样式(您可能需要更改样式以适合您的设计)。数据网格应该类似于:

<DataGrid x:Name="dgMain" ItemsSource="{Binding TestArray}" Margin="0,20,0,0" AutoGenerateColumns="False">
    <DataGrid.RowHeaderStyle>
        <Style TargetType="{x:Type DataGridRowHeader}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                        <Border BorderThickness="0.3,0.3,0.3,0.3" BorderBrush="Black" Width="40">
                            <TextBlock Text="{Binding Index}" Padding="2,1,1,1"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.RowHeaderStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
    </DataGrid.Columns>
</DataGrid>

对于{Binding Index}部分,您必须使用Id属性扩展您的模型,该属性将保存每个项目的索引。在创建项目模型时,应该填充该索引(int)。在我的测试示例中,我使用了静态变量,例如下面的示例:

public class ItemModel
{
    private static int counter = 0;
    public int Index { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public DateTime Age { get; set; }

    public ItemModel(string name, string address, DateTime? age = null)
    {
        Name = name;
        Address = address;
        Age = age ?? DateTime.Now;
        Index = ++counter;
    }
}

对于你的第二个问题:我认为你无法以简单的方式返回原始排序。但是,您可以执行以下操作:

private void Button_Click(object sender, RoutedEventArgs e)
{
    // clear sorting!
    foreach (DataGridColumn column in this.dgMain.Columns)
    {
        column.SortDirection = null;
    }

    testArray.Add(new ItemModel("A:fourth", "ee"));
}

在向可观察集合中添加新值之前(我希望您使用可观察集合,即使您编写了&#34;从数组中获取数据的DataGird:&#34;)您必须为每个数据网格列清除它排序。这样做,您将始终在datagrid的最后位置添加新创建的项目。但是,正如我已经说过的,以前行的顺序将保持不变。我希望这对你有用。