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
如何使WPF DataGrid列绑定到枚举?_Wpf_Xaml_Data Binding_Datagrid - Fatal编程技术网

如何使WPF DataGrid列绑定到枚举?

如何使WPF DataGrid列绑定到枚举?,wpf,xaml,data-binding,datagrid,Wpf,Xaml,Data Binding,Datagrid,我有一个绑定到WPFDataGrid的项目集合。其中一列需要允许用户从枚举中进行选择。我还创建了一个单独的类来保存每个枚举值的用户友好的显示字符串 这些类型包括: public enum UnitEnum { Metres, Hours, SingleValue }; public class UnitTuple { public UnitEnum Unit { get; set; } public string DisplayName { get; set; } } pub

我有一个绑定到WPF
DataGrid
的项目集合。其中一列需要允许用户从枚举中进行选择。我还创建了一个单独的类来保存每个枚举值的用户友好的显示字符串

这些类型包括:

public enum UnitEnum { Metres, Hours, SingleValue };

public class UnitTuple
{
    public UnitEnum Unit { get; set; }
    public string DisplayName { get; set; }
}

public class CostItem
{
    public string Name { get; set; }
    public UnitEnum UnitID { get; set; }
}
这是我的视图模型:

public static List<UnitTuple> AllUnitTuples = new List<UnitTuple>()
{
    new UnitTuple { Unit = UnitEnum.Metres, DisplayName = "Metres" },
    new UnitTuple { Unit = UnitEnum.Hours, DisplayName = "Hours" },
    new UnitTuple { Unit = UnitEnum.SingleValue, DisplayName = "Single Value" }
};

public List<CostItem> CostItems => new List<CostItem>()
{
    new CostItem() { Name = "Design", UnitID = UnitEnum.SingleValue },
    new CostItem() { Name = "Manufacturing", UnitID = UnitEnum.Hours },
    new CostItem() { Name = "Materials", UnitID = UnitEnum.Metres }
};
其中一个方法是:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{x:Static local:YourViewModelClassName.AllUnitTuples}" SelectedValuePath="Unit" SelectedValue="{Binding UnitID, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

您可以使用转换器在数据网格中显示枚举

public class EnumConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((Enum)value).ToString()
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return  null;
    }
}
在您的XAML中,类似这样的内容:

Binding="{Binding UnitID, Converter="{StaticResource ResourceKey=EnumConverter}}" 

在xaml文件的参考资料部分声明“EnumConverter”。

将enum绑定到
DataGridComboBox

在参考资料部分添加一个
ObjectDataProvider

<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:UnitEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

我不认为丢失的转换器是我问题的主要部分。如果我在代码中将所有枚举都改为整数,我仍然无法让它工作。(但是+1,因为,是的,毫无疑问我需要一个转换器或ToString()覆盖。)我现在就用它做实验。但它确实感觉像是一个二级解决方案,因为DataGrid已经有了一个组合框列类型,它似乎是专门为实现我想要的功能而设计的。我想让它发挥作用,这是为了将来的知识。
Binding="{Binding UnitID, Converter="{StaticResource ResourceKey=EnumConverter}}" 
<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:UnitEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<DataGridComboBoxColumn Header="MyHeader" DisplayMemberPath="EnumValue" ItemsSource="{Binding Source={StaticResource myEnumData}}" SelectedItemBinding="{Binding UnitID}"/>