C# 使用字符串作为DataGridComboxColumn项的前缀
我有一个DataGridComboxColumn,其中包含一个枚举组合框(在本例中为F1、F2、F3)。我想在组合框中的每个项目前面加一个字符串-在本例中为“SHIFT+”,这样组合框就会显示字符串,如“SHIFT+F1”、“SHIFT+F2”等 有办法做到这一点吗?我尝试过使用IValueConverter,虽然代码正确执行并中断了转换器的返回值,但组合框中不会显示这些值: XAMLC# 使用字符串作为DataGridComboxColumn项的前缀,c#,wpf,xaml,C#,Wpf,Xaml,我有一个DataGridComboxColumn,其中包含一个枚举组合框(在本例中为F1、F2、F3)。我想在组合框中的每个项目前面加一个字符串-在本例中为“SHIFT+”,这样组合框就会显示字符串,如“SHIFT+F1”、“SHIFT+F2”等 有办法做到这一点吗?我尝试过使用IValueConverter,虽然代码正确执行并中断了转换器的返回值,但组合框中不会显示这些值: XAML DataGridComboBoxColumn Header="Keyboard Shortcut"
DataGridComboBoxColumn Header="Keyboard Shortcut"
ItemsSource="{Binding Source={StaticResource enumShortcuts}}"
SelectedItemBinding="{Binding ManagerShortcut, Converter={StaticResource ResourceKey=shortcutConverter}}"/>
其中enumShortcuts是枚举,ManagerShortcut是属性
代码
if (value != null)
return $"SHIFT + {value}";
或者,也许有一种更简单的方法可以用StringFormat实现这一点?我假设这些类可以解决这个问题
public enum enumShortcuts
{
F1,
F2
}
public class ShortCuts
{
public string Name { get; set; }
public enumShortcuts ManagerShortcut { get; set; }
}
Xaml.cs:在DataGridComboxColumn列中,我们需要绑定转换器,一个用于将枚举转换为字符串,另一个用于在SelectedItemBinding中转换字符串到枚举的转换器。对于在xaml中引用转换器,使用静态标记扩展
<Grid>
<Grid.Resources>
<ObjectDataProvider ObjectType="{x:Type sys:Enum}"
x:Key="asd"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:enumShortcuts"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Grid.Resources>
<DataGrid ItemsSource="{Binding}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Keys"
ItemsSource="{Binding Source={StaticResource asd},
Converter={x:Static local:EnumToStringConverters.enum}}"
SelectedItemBinding="{Binding ManagerShortcut,
Converter={x:Static local:StringTOEnumConverter.enum}}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这里是用于枚举的往返转换的转换器
/// <summary> Converts the enums to string and appends "SHIFTS - " to each item</summary>
public class EnumToStringConverters : IValueConverter
{
public static EnumToStringConverters @enum { get; set; } = new EnumToStringConverters();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Check for null for simplity i didnt inlcude
enumShortcuts[] mies = (enumShortcuts[])value;
return Enum.GetNames(mies[0].GetType()).Select(x => "SHIFT - " + x);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
/// <summary> Converts the string to enum by remove "SHIFTS - " from each item</summary>
public class StringTOEnumConverter : IValueConverter
{
public static StringTOEnumConverter @enum { get; set; } = new StringTOEnumConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Check for null for simplity i didnt inlcude
return "SHIFT - " + value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Check for null for simplity i didnt inlcude
return Enum.Parse(typeof(enumShortcuts), value.ToString().Split('-')[1].Replace(" ", ""));
}
}
///将枚举转换为字符串,并将“移位-”附加到每个项
公共类EnumToString转换器:IValueConverter
{
public static EnumToStringConverters@enum{get;set;}=new EnumToStringConverters();
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
//检查null是否简单,我没有输入
enumShortcuts[]mies=(enumShortcuts[])值;
返回Enum.GetNames(mies[0].GetType()).Select(x=>“SHIFT-”+x);
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
///通过从每个项中删除“移位-”将字符串转换为枚举
公共类StringTOEnumConverter:IValueConverter
{
公共静态StringTOEnumConverter@enum{get;set;}=new StringTOEnumConverter();
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
//检查null是否简单,我没有输入
返回“移位-”+值;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
//检查null是否简单,我没有输入
返回Enum.Parse(typeof(enumShortcuts),value.ToString().Split('-')[1]。Replace(“,”);
}
}
老实说,我非常感谢你。你帮我省了好几个小时拔头发。非常感谢。很高兴它帮助了你!