我是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进行排序,那么行的索引就不会改变。
左边的是未分类的,右边的是按名称排序的。在这个例子中,线的索引&#34; F&#34;应该是6而不是1(右图)。
(与问题无关:为什么选择所有RowHeaders?)
问题2:
我得到了什么: 请参阅问题1
我想要的是什么:我添加了一行后,它应该跳转到下一个空行。
问题是什么?:如果我对数据网格进行排序,它会跳转到下一行,即使它不是空的。
首先,我按名称对列表进行了排序,然后添加了&#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;。
我真的希望有简单的解决方案。谢谢:))
答案 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的最后位置添加新创建的项目。但是,正如我已经说过的,以前行的顺序将保持不变。我希望这对你有用。