更改DataGrid中的列的顺序

时间:2014-07-07 20:43:09

标签: c# wpf xaml datagrid

我想创建类似可重用控件的东西。

我已将名为MyDataGrid.xaml的页面添加到我的Project(WPFApplication2)的根目录中。我已将根元素从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>

在MyDataGrid.xaml.cs中,我将基类更改为DataGrid。你可以在下面看到:

public partial class MyDataGrid : DataGrid
{
    public MyDataGrid()
    {
        InitializeComponent();
    }
}

现在默认提供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>

我的问题:

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

删除姓名年龄班学校

在上面提到的列中,Default Column由Default提供,其他列在MainWindow.xmal

中声明

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

姓名年龄班学校删除

1 个答案:

答案 0 :(得分:1)

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

您构建Reusable control的方式始终会将First Column插入删除

为了解决你所做的事情,我将Delete column定义为资源。

<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>

然后在我的.cs文件中,我看起来像这样

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);
    }
}

现在,我们总是在最后添加Delete column