[英]Sort column headers in wpf datagrid from xaml
public DataTable Data
{
get { return _tableData; }
set
{
if (Equals(value, _tableData)) return;
_tableData = value;
NotifyOfPropertyChange();
}
}
我有我的xaml datagrid:
<DataGrid
HorizontalAlignment="Stretch"
IsReadOnly="True" ItemsSource="{Binding Data}"
AutoGenerateColumns="True">
</DataGrid>
可以說, DataTable
會有下一列:
我需要一種通過xaml
按字母順序表示它們的方法:
我已經嘗試過的:
<CollectionViewSource x:Key="ColumnsDatagridViewSource" Source="{Binding Data}"> <CollectionViewSource.SortDescriptions> <componentModel:SortDescription PropertyName="ColumnHeader"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource>
沒有幫助,陣列發生了。 它嘗試在列標題字符串中查找此屬性。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { System.Collections.IList collection = value as System.Collections.IList; ListCollectionView view = new ListCollectionView(collection); SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending); view.SortDescriptions.Add(sort); return view; }
由於您是自動生成列,我認為最好的方法是使用DataGrid.AutoGeneratingColumn事件 。
我想出了這個代碼 - 仔細,沒有經過充分測試 - 按字母順序重新排序列:
XAML
<DataGrid ItemsSource="{Binding Data}"
AutoGenerateColumns="True"
AutoGeneratingColumn="dg_AutoGeneratingColumn" />
代碼隱藏
public class DataItem
{
public string Name { get; set; }
public string Ask { get; set; }
public string Date { get; set; }
public string Zulu { get; set; }
public DataItem(string n, string a, string d, string z)
{
Name = n;
Ask = a;
Date = d;
Zulu = z;
}
}
public partial class MainWindow : Window
{
ObservableCollection<DataItem> data = new ObservableCollection<DataItem>();
public ObservableCollection<DataItem> Data
{
get
{
return data;
}
}
public MainWindow()
{
Data.Add(new DataItem("A", "No", "07/14", "?"));
Data.Add(new DataItem("B", "Yes", "07/14", "!"));
Data.Add(new DataItem("C", "Tes", "07/14", "*"));
Data.Add(new DataItem("D", "No", "07/14", "%"));
InitializeComponent();
this.DataContext = this;
}
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGrid dg = sender as DataGrid;
if (dg != null && e != null)
{
DataGridColumn currentColumn = e.Column;
if (currentColumn != null)
{
string currentHeader = currentColumn.Header.ToString();
int currentIndex = 0;
// Sort the Columns by name so we add the new column to the correct index
foreach (DataGridColumn dgc in (dg.Columns.OrderBy(col => col.Header.ToString())))
{
if (currentHeader.CompareTo(dgc.Header.ToString()) < 0)
{
// set the current columns
currentColumn.DisplayIndex = currentIndex;
// short-circuit the loop so we don't keep comparing after we already
// found the correct index to place the current column
break;
}
currentIndex++;
}
}
}
}
}
不使用dg_AutoGeneratingColumn
輸出:
使用dg_AutoGeneratingColumn
輸出:
如果有人對我的表現感興趣:
<DataGrid
HorizontalAlignment="Stretch"
IsReadOnly="True"
IsReadOnly="True" ItemsSource="{Binding Data, Converter={StaticResource DataGridSortingConverter}}"
AutoGenerateColumns="True">
</DataGrid>
我添加了IValueConverter
進行排序,沒什么特別的,需要重構,但你可以得到一個想法:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
var dataTable = value as DataTable;
if (dataTable != null)
{
var columnsList = (from object column in dataTable.Columns select column.ToString()).ToList();
columnsList = columnsList.OrderBy(col => col).ToList();
for (var i = 0; i < columnsList.Count; i++)
{
dataTable.Columns[columnsList[i]].SetOrdinal(i);
}
return dataTable;
}
return value;
}
這段代碼的作用:
首先,我從datatable獲取列名,然后按照我需要的順序對它們進行排序。 接下來,我在列上使用內置的SetOrdinal
方法,將其置於正確的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.