【发布时间】:2021-11-30 02:40:46
【问题描述】:
要求
我想向 WPF DataGrid 添加一个带有组合框的列,以满足以下要求:
- ComboBox中显示的值应该是枚举常量的名称
- ComboBox 中的条目应按枚举常量的名称排序
- 底层对象中的属性类型应该是枚举,而不是字符串
- 应减少点击次数。当我使用 DataGridComboBoxColumn 时,我需要大约 4 次单击来更改一个值。
- 我实际上喜欢代码隐藏解决方案,尽管基于 XAML 的解决方案也很好。
- 它应该在 .NET 5 WPF 下运行
示例应用程序
应用程序使用 DataGridComboBoxColumn 中提供的代码。它有效,但有两个问题:
-
详细信息下拉列表按字母顺序列出条目。在我的实际应用程序中,我有更多条目,当它们没有排序时很难找到正确的条目。
-
需要点击 4 次鼠标来更改 ComboBox 的值。
代码
XAML:
<Window x:Class="SortedComboBoxDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SortedComboBoxDataGrid"
xmlns:core="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" SizeToContent="WidthAndHeight">
<Window.Resources>
<CollectionViewSource x:Key="SamplesViewSource" CollectionViewType="ListCollectionView"/>
<ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="{x:Type core:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:DetailEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<DataGrid x:Name="MainDataGrid" DataContext="{StaticResource SamplesViewSource}" ItemsSource="{Binding}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=SomeText}" Header="SomeText"/>
<DataGridComboBoxColumn Header="Detail" SelectedItemBinding="{Binding Detail}"
ItemsSource="{Binding Source={StaticResource myEnum}}"/>
</DataGrid.Columns>
</DataGrid>
</Window>
枚举DetailEnum:
namespace SortedComboBoxDataGrid {
public enum DetailEnum {
No,
Some,
Many,
All
}
示例类:
public class Sample {
public string SomeText { get; set; }
public DetailEnum Detail { get; set; }
public Sample(string someText, DetailEnum detail) {
SomeText = someText;
Detail = detail;
}
}
}
后面的窗口代码:
using System.Collections.Generic;
using System.Windows;
namespace SortedComboBoxDataGrid {
public partial class MainWindow: Window {
public MainWindow() {
InitializeComponent();
var samples = new List<Sample>() {
new Sample("first", DetailEnum.All),
new Sample("second", DetailEnum.Many),
new Sample("any", DetailEnum.Some),
new Sample("last", DetailEnum.No),
};
var samplesViewSource = ((System.Windows.Data.CollectionViewSource)(FindResource("SamplesViewSource")));
samplesViewSource.Source = samples;
}
}
}
我已经尝试过了
我试过Displaying sorted enum values in a ComboBox。这很好地对枚举进行了排序,但这样做会将枚举值转换为字符串,然后对这些字符串进行排序。如果用户点击不同的条目,网格会返回一个字符串而不是枚举值。
我尝试了在 stackoverflow 上找到的各种解决方案来减少技巧的数量,但无法让其中一种与排序 (!) 枚举一起正常工作。
我想知道对于 ComboBox 使用具有枚举值和枚举名称作为其属性而不是 List 的类实例列表是否会更好?
public class DetailEnumClass {
public DetailEnum EnumValue { get; set; }
public string EnumName { get; set; }
}
请在将此问题标记为重复问题之前阅读此内容
我知道关于我在这里提到的一个或另一个问题,stackoverflow 上已经有很多答案。但是,我无法提出涵盖所有要求的可行解决方案。因此,如果您找到了为完整问题提供完整代码的答案,请仅将此问题标记为重复。谢谢。
【问题讨论】:
标签: c# wpf enums combobox datagrid