Prefix DataGridComboBoxColumn items with string

人走茶凉 提交于 2021-01-29 16:32:09

问题


I have a DataGridComboBoxColumn which contains a ComboBox of enums (in this instance F1, F2, F3). I want to prefix each item in that ComboBox with a string - in this instance "SHIFT + ", so that the ComboBox displays strings such as "SHIFT + F1", "SHIFT + F2" etc.

Is there a way to do this? I've tried using an IValueConverter and whilst the code executes correctly and breaks on the return value of the converter, the values are not displayed in the ComboBox:

XAML

DataGridComboBoxColumn Header="Keyboard Shortcut"
                                        ItemsSource="{Binding Source={StaticResource enumShortcuts}}"
                                        SelectedItemBinding="{Binding ManagerShortcut, Converter={StaticResource ResourceKey=shortcutConverter}}"/>

Where enumShortcuts are the enums, ManagerShortcut is the property.

Code

    if (value != null)
        return $"SHIFT + {value}";

Or perhaps there's an even easier way to do this with StringFormat?


回答1:


I assume these the classes to solve the problem

public enum enumShortcuts
{
    F1,
    F2
}

public class ShortCuts
{
    public string Name { get; set; }
    public enumShortcuts ManagerShortcut { get; set; }
}

Xaml.cs: In the DataGridComboBoxColumn, we need bind the converters one for converting enum to string to Itemsource property and other for string to enum converters in SelectedItemBinding. For refering converter in the xaml, static markup extension is used.

<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>

Here the converters used for to and fro conversion of enums.

/// <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(" ", ""));
    }
}


来源:https://stackoverflow.com/questions/62403084/prefix-datagridcomboboxcolumn-items-with-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!