繁体   English   中英

对xaml中的第一列启用DataGrid排序

[英]Enable DataGrid sorting for first column in xaml

我在WPF中有一个带有自动生成列的DataGrid。

如何禁用除与Source中的时间相对应的第一行以外的所有行的排序功能。

我正在关注MVVM模式,并且我知道CanUserSortColumns正在禁用所有列的排序。 我想禁用除第一列以外的所有内容。

我应该编写触发器或交互或其他内容吗? 感谢所有帮助。

<DataGrid AutoGenerateColumns="True" 
        ItemsSource="{Binding MyDataTable}" 
        CanUserSortColumns="False">
</DataGrid>

我为您找到了以下代码片段

<my:DataGridTemplateColumn  SortMemberPath="CompleteDate" Header="Complete Date" CanUserSort="true">
            <my:DataGridTemplateColumn.CellTemplate >
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <Binding Path="CompleteDate" ConverterCulture="en-GB" StringFormat="{}{0:MM/dd/yyyy}"/>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
                </my:DataGridTemplateColumn.CellTemplate>
            </my:DataGridTemplateColumn>

使用CanUserSort属性明确定义其可排序状态列。 SortMemberPath定义用于排序的属性。 希望这可以帮助。

更新:如果您正在使用自动生成的列,则无法通过xaml访问它们。 因此,您需要在代码文件中访问它们。

我对xaml网格不熟悉,但是会期望像这样:

//Bound Data here so that the Grid generate the columns

int i = 0;
foreach (DataColumn column in myGrid.ColumnCollection)
{
   if (i == 0)
      column.CanSortUser = true;
   else
      column.CanSortUser = false;

   i++;
}

原始的Typename可以不同,但​​是应该可以这样做。

UPDATE-2

如果您不想损害MVVM,可以使用此方法 描述了如何使用接口访问代码并与视图和视图模型保持独立。

问题是, DataGridColumnHeader具有CanUserSort属性作为本地计算属性。 可以通过手动生成列(不需要的列)进行设置。

如果它是setter的属性,则可以创建一个DataTrigger查看TabIndex == 0并通过xaml样式的Setter进行设置。

使用AutoGeneratedColumns唯一机会如下:

<DataGrid AutoGenerateColumns="True" 
    ItemsSource="{Binding MyDataTable}" 
    CanUserSortColumns="True"
    AutoGeneratedColumns="DataGrid_OnAutoGeneratedColumns">
</DataGrid>

您的代码背后:

private void DataGrid_OnAutoGeneratedColumns(object sender, EventArgs e)
{
    DataGrid dg = sender as DataGrid;
    if (dg == null) return;
    dg.Columns.ToList().Select((col, indx) => new {Col = col, Indx = indx}).ToList().ForEach(obj => obj.Col.CanUserSort = obj.Indx == 0);
}

这将启用第一列UserCanSort属性,并禁用其他属性。 该函数独立于您的viewmodel ,可以放在文件后面的view.xaml.cs代码中。

编辑:

如果您没有任何代码隐藏,则可以使用自己的DataGridControl

MyDataGrid.cs

namespace YourNamespace {
    public class MyDataGrid : DataGrid
    {
        protected override void OnAutoGeneratedColumns(EventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            if (dg == null) return;
            dg.Columns.ToList().Select((col, indx) => new {Col = col, Indx = indx}).ToList().ForEach(obj => obj.Col.CanUserSort = obj.Indx == 0);

            base.OnAutoGeneratedColumns(e);
        }
    }
}

您的看法:

<YourNamespace:MyDataGrid AutoGenerateColumns="True" 
    ItemsSource="{Binding MyDataTable}" 
    CanUserSortColumns="True">
</YourNamespace:MyDataGrid>

这样就完成了,无需任何单行代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM