Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字符串作为DataGridComboxColumn项的前缀_C#_Wpf_Xaml - Fatal编程技术网

C# 使用字符串作为DataGridComboxColumn项的前缀

C# 使用字符串作为DataGridComboxColumn项的前缀,c#,wpf,xaml,C#,Wpf,Xaml,我有一个DataGridComboxColumn,其中包含一个枚举组合框(在本例中为F1、F2、F3)。我想在组合框中的每个项目前面加一个字符串-在本例中为“SHIFT+”,这样组合框就会显示字符串,如“SHIFT+F1”、“SHIFT+F2”等 有办法做到这一点吗?我尝试过使用IValueConverter,虽然代码正确执行并中断了转换器的返回值,但组合框中不会显示这些值: XAML DataGridComboBoxColumn Header="Keyboard Shortcut"

我有一个DataGridComboxColumn,其中包含一个枚举组合框(在本例中为F1、F2、F3)。我想在组合框中的每个项目前面加一个字符串-在本例中为“SHIFT+”,这样组合框就会显示字符串,如“SHIFT+F1”、“SHIFT+F2”等

有办法做到这一点吗?我尝试过使用IValueConverter,虽然代码正确执行并中断了转换器的返回值,但组合框中不会显示这些值:

XAML

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(“,”);
}
}

老实说,我非常感谢你。你帮我省了好几个小时拔头发。非常感谢。很高兴它帮助了你!