将 DataGridComboBoxColumn 绑定到枚举类型

7
我有一个简单的 DataGrid,我希望用户能添加一些行。但是,我希望其中一列是一个下拉框,它的值来自于一个枚举。
在我的 XAML 中,最简单的方法是什么?
我尝试了以下代码,但是我得到了错误 "Two-way binding requires Path or XPath"。
<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData"
                MethodName="GetValues" 
                ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:MyEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

...

   <DataGrid.Columns>
        <DataGridComboBoxColumn Header="MyHeader" DisplayMemberPath="EnumValue" 
            SelectedItemBinding="{Binding Source={StaticResource myEnumData}}">
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
3个回答

10

XAML

xmlns:ext="clr-namespace:Project.Core.Tools;assembly=Project.Core"

<DataGridComboBoxColumn ItemsSource="{x:Static ext:Extensions.GetEnumTypes}" SelectedItemBinding="{Binding EnumType}" />

静态类

public static IEnumerable<EnumType> GetEnumTypes => Enum.GetValues(typeof(EnumType)).Cast<EnumType>();

10

您试图绑定所选项,而您(大概)想要绑定可用项的列表。将绑定更改为以下内容:

<DataGridComboBoxColumn Header="MyHeader"
        ItemsSource="{Binding Source={StaticResource myEnumData}, Mode=OneWay}">
</DataGridComboBoxColumn>

嗨,史蒂夫,我现在不再出现错误了 - 谢谢。然而,组合框是空的。我应该提到DataGrid一开始就是空的,我正在填充所有行(没有现有数据)。 - openshac
你的意思是 ComboBox 没有选中项,还是当你点击它时下拉列表中没有任何项? - Steve Greatrex
我的意思是ComboBox中没有任何项目。 - openshac
如果您从“ComboBox”中选择一个值,您是否在单元格中看到任何内容? - Steve Greatrex
我不确定,但那可能只是数据网格组合框的行为...很抱歉我无法在这方面提供帮助! - Steve Greatrex
显示剩余3条评论

0

XAML:

<DataGridComboBoxColumn ItemsSource="{Binding Orientantion, Mode=OneTime, Converter={Converts:EnumToItemSourceConverter}}" SelectedItem="{Binding Orientantion}"/>

C#:

public enum OrientantionTypes : int { Custom, Automatic}

public OrientantionType Orientantion { get; set;}

转换器:

public class EnumToItemSourceConverter: MarkupExtension, IValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is Enum ))
            return null;
        {
            Type enumType = value.GetType();
            var listType = typeof(List<>);
            var constructedListType = listType.MakeGenericType(enumType);

            var instance = Activator.CreateInstance(constructedListType);

            foreach (var m in Enum.GetValues(enumType))
            {
                ((IList)instance).Add(m);
            }
            return (IList)instance;
        }

        return null;
    }

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接