C# 更改数据网格中列的顺序

C# 更改数据网格中列的顺序,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我想创建一些类似于可重用控件的东西 我已将名为MyDataGrid.xaml的页面添加到我的项目(WPFAApplication2)的根目录中。我已将根元素从Page更改为DataGrid,并在其中添加了一列。您可以在下面的xaml中看到这些更改: <DataGrid x:Class="WpfApplication2.MyDataGrid" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我想创建一些类似于可重用控件的东西

我已将名为MyDataGrid.xaml的页面添加到我的项目(WPFAApplication2)的根目录中。我已将根元素从Page更改为DataGrid,并在其中添加了一列。您可以在下面的xaml中看到这些更改:

<DataGrid x:Class="WpfApplication2.MyDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="X" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
现在我已经默认提供了MainWindow.xaml。我将此可重用控件添加到MainWindow.xaml中,并添加了一些列,如下所示:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Self="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Self:MyDataGrid>
            <Self:MyDataGrid.Columns>
                <DataGridTextColumn Header="Name" />
                <DataGridTextColumn Header="Age" />
                <DataGridTextColumn Header="Class" />
                <DataGridTextColumn Header="School" />
            </Self:MyDataGrid.Columns>
        </Self:MyDataGrid>
    </Grid>
</Window>

我的问题:

当我运行程序时,列的顺序如下:

删除年龄班学校的名称

在上述列中,默认情况下提供Delete列,其他列在MainWindow.xmal中声明

现在,我想更改列的顺序,使默认列显示在DataGrid的末尾,如下所示:


Name Age Class School Delete

首先,这不是创建可重用控件的方式。您应该定义一个仅继承到
DataGrid
的类,并对自定义控件使用
style

您构建
可重用控件的方式总是将
第一列作为删除插入

为了修复您的问题,我将我的
Delete列
定义为一个资源

<DataGrid x:Class="WindowsApplication1.Blah"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300">
    <DataGrid.Resources>
        <DataGridTemplateColumn Header="Delete" x:Key="DeleteColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="X" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" />
        <DataGridTextColumn Header="Age" />
        <DataGridTextColumn Header="Class" />
        <DataGridTextColumn Header="School" />
    </DataGrid.Columns>
</DataGrid>

现在,我们将始终在末尾添加
删除列

谢谢。在我看了你的答案之后,我已经用另一种方式做了。但是想法是一样的&我从你的回答中得到了这个想法。非常感谢你。
<DataGrid x:Class="WindowsApplication1.Blah"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300">
    <DataGrid.Resources>
        <DataGridTemplateColumn Header="Delete" x:Key="DeleteColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="X" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" />
        <DataGridTextColumn Header="Age" />
        <DataGridTextColumn Header="Class" />
        <DataGridTextColumn Header="School" />
    </DataGrid.Columns>
</DataGrid>
public partial class Blah : DataGrid
{
    public Blah()
    {
        InitializeComponent();
        this.Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var templateColumn = this.Resources["DeleteColumn"] as DataGridTemplateColumn;
        this.Columns.Add(templateColumn);
    }
}