为什么此 CollectionViewSource 不对枚举的 ToString() 结果进行排序?
Why does this CollectionViewSource not sort on the enum's ToString() result?
我有一个用于为 ItemsControl
:
生成项目的视图模型
public class PermissionItemViewModel
{
public PermissionsEnum Permission {get; set;}
}
枚举本身的定义方式是列表自然不会按字母顺序排列,当控件呈现时,项目的顺序与枚举定义相同。
在我看来,我正在尝试定义一个 CollectionViewSource
并使其按本质上 myEnumValue.ToString()
对这些项目进行排序。相反,排序似乎是按照枚举值的顺序而不是(我认为的)隐式 ToString()
结果。
<CollectionViewSource x:Key="permissionsViewSource"
Source="{Binding PermissionItems}"> <!-- ObservableCollection<PermissionItemViewModel> -->
<CollectionViewSource.SortDescriptions>
<cm:SortDescription PropertyName="Permission" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
最终,我使用这样的来源:
<ItemsControl ItemsSource="{Binding Source={StaticResource permissionsViewSource}}" />
我希望它按枚举的名称而不是它们的值排序。我怎样才能强制它这样做?
看起来像you may be able to grab the ListCollectionView
and do a custom sort on that.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
CollectionViewSource source = (CollectionViewSource)(this.Resources["MyCollectionViewSource1"]);
ListCollectionView view = (ListCollectionView)source.View;
view.CustomSort = new CustomSorter();
}
public class CustomSorter : IComparer
{
public int Compare(object x, object y)
{
var itemx = x as PermissionItemViewModel;
var itemy = y as PermissionItemViewModel;
return $"{itemx.Permission}".CompareTo($"{itemy.Permission}");
}
}
您可以将此写成 CollectionViewSource
的附加行为,它的值将采用 属性 名称,这样可以稍稍减轻您的良心。顺便说一句,我认为您希望在 View
上设置一个 属性 更改的处理程序——我想我曾经写过这样的东西,让我们看看我是否可以挖掘它...
我有一个用于为 ItemsControl
:
public class PermissionItemViewModel
{
public PermissionsEnum Permission {get; set;}
}
枚举本身的定义方式是列表自然不会按字母顺序排列,当控件呈现时,项目的顺序与枚举定义相同。
在我看来,我正在尝试定义一个 CollectionViewSource
并使其按本质上 myEnumValue.ToString()
对这些项目进行排序。相反,排序似乎是按照枚举值的顺序而不是(我认为的)隐式 ToString()
结果。
<CollectionViewSource x:Key="permissionsViewSource"
Source="{Binding PermissionItems}"> <!-- ObservableCollection<PermissionItemViewModel> -->
<CollectionViewSource.SortDescriptions>
<cm:SortDescription PropertyName="Permission" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
最终,我使用这样的来源:
<ItemsControl ItemsSource="{Binding Source={StaticResource permissionsViewSource}}" />
我希望它按枚举的名称而不是它们的值排序。我怎样才能强制它这样做?
看起来像you may be able to grab the ListCollectionView
and do a custom sort on that.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
CollectionViewSource source = (CollectionViewSource)(this.Resources["MyCollectionViewSource1"]);
ListCollectionView view = (ListCollectionView)source.View;
view.CustomSort = new CustomSorter();
}
public class CustomSorter : IComparer
{
public int Compare(object x, object y)
{
var itemx = x as PermissionItemViewModel;
var itemy = y as PermissionItemViewModel;
return $"{itemx.Permission}".CompareTo($"{itemy.Permission}");
}
}
您可以将此写成 CollectionViewSource
的附加行为,它的值将采用 属性 名称,这样可以稍稍减轻您的良心。顺便说一句,我认为您希望在 View
上设置一个 属性 更改的处理程序——我想我曾经写过这样的东西,让我们看看我是否可以挖掘它...