[英]How to set up ToggleFlyoutMenuItems so that only 1 option can be toggled on at a time?
[英]wpf set sorting programmatically, so that the header is toggled as sorted
我有一個wpf工具包DataGrid
的問題。
我有一個有三列的ItemsSource
:
名字
姓
地址
在C#代碼隱藏中,我設置了排序方向以及要對其進行排序的列,如下所示:
ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("LastName", ListSortDirection.Ascending));
view.Refresh();
實際排序沒有問題,但標題中有視覺風格。 如果用戶通過單擊標題對列進行排序,則視覺樣式會更改,但視覺樣式不表示以編程方式設置列排序描述。
為什么會這樣,我如何切換標題以使其顯示為已排序?
我之前沒有嘗試過,但我認為你可以設置列的SortDirection屬性。
int columnIndex = 0;
this.dataGrid1.ColumnFromDisplayIndex(columnIndex).SortDirection =
ListSortDirection.Descending;
下面的示例將讓您使用組合框對數據網格進行排序,並直接單擊數據網格。
XAML:
<Window x:Class="DataGridDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=System"
Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider MethodName="GetValues"
ObjectType="{x:Type System:Enum}"
x:Key="SortDirections">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="ComponentModel:ListSortDirection" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel>
<ComboBox
Name="_columnsComboBox"
ItemsSource="{Binding Path=Columns, ElementName=_dataGrid}"
DisplayMemberPath="Header"
SelectionChanged="OnSort" />
<ComboBox
Name="_sortDirectionsComboBox"
ItemsSource="{Binding Source={StaticResource SortDirections}}"
SelectionChanged="OnSort" />
<Controls:DataGrid
Name="_dataGrid"
ItemsSource="{Binding Path=PeopleData}" />
</StackPanel>
</Window>
代碼背后:
using System;
using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Microsoft.Windows.Controls;
namespace DataGridDemo
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
PeopleData = new DataTable();
PeopleData.Columns.Add(new DataColumn("Name", typeof(string)));
PeopleData.Columns.Add(new DataColumn("Age", typeof(int)));
var row = PeopleData.NewRow();
row["Name"] = "Sara";
row["Age"] = 25;
PeopleData.Rows.Add(row);
row = PeopleData.NewRow();
row["Name"] = "Bob";
row["Age"] = 37;
PeopleData.Rows.Add(row);
row = PeopleData.NewRow();
row["Name"] = "Joe";
row["Age"] = 10;
PeopleData.Rows.Add(row);
DataContext = this;
}
public DataTable PeopleData { get; private set;}
private void OnSort(object sender, SelectionChangedEventArgs e)
{
if (_sortDirectionsComboBox.SelectedIndex == -1 || _columnsComboBox.SelectedIndex == -1)
{
return;
}
foreach (DataGridColumn dataColumn in _dataGrid.Columns)
{
dataColumn.SortDirection = null;
}
ListSortDirection sortDescription = (ListSortDirection)(_sortDirectionsComboBox.SelectedItem);
DataGridColumn selectedDataColumn = _columnsComboBox.SelectedItem as DataGridColumn;
selectedDataColumn.SortDirection = sortDescription;
ICollectionView view = CollectionViewSource.GetDefaultView(_dataGrid.ItemsSource);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription(selectedDataColumn.Header as string, sortDescription));
view.Refresh();
}
}
}
如果要將有效排序與列上的Visual樣式同步,這應該有所幫助:
( (INotifyCollectionChanged)Items.SortDescriptions ).CollectionChanged += new NotifyCollectionChangedEventHandler( OnItemsSortDescriptionsChanged );
private void OnItemsSortDescriptionsChanged( object sender, NotifyCollectionChangedEventArgs e )
{
//Synchronize effective sorting in the grid and Visual style on columns
if ( Items != null )
{
foreach ( DataGridColumn column in Columns )
{
column.SortDirection = null;
foreach ( SortDescription sd in Items.SortDescriptions )
{
if ( column.SortMemberPath == sd.PropertyName )
{
column.SortDirection = sd.Direction;
break;
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.