[英]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.