0

我有一个像这样的模型类:

public class AttributesModel
    {
        public SortOrder SortBy { get; set; }

        public enum SortOrder
        {
            Unsorted,
            Ascending,
            Descending
        }

        public AttributesModel(string field)
        {
            Field = field;
        }
    }

还有一个 DataGrid,其中包含一个 Combobox 作为列之一,如下所示:

<DataGridTemplateColumn Width="Auto" IsReadOnly="False" Header="Order">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Path=AttributesModel}" DisplayMemberPath="SortBy" SelectedValuePath="SortBy" SelectedValue="{Binding Path=AttributesModel}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

包含 DataGrid 的类还具有以下构造函数:

DataContext = this;
itemsSource = new ObservableCollection<AttributesModel>(parentDatabaseTable.ListFields.Select(f => new AttributesModel(f)));

出于某种原因,我的 DataGrid 中的所有字段都在填充,但组合框除外。请注意,为了简单和可读性,我没有包含模型类中其他字段的代码,也没有包含 DataGrid 中的列。除了组合框列之外,它们都已成功填充。有任何想法吗?

4

2 回答 2

2

AnItemsSource必须是一个集合。你AttributeModel不是收藏品。

如果你想绑定一个枚举的选项,我过去用过这个:

public class EnumWrapper<T> where T:struct
{
    private List<T> values;

    public List<T> Values
    {
        get { return values; }
        set { values = value; }
    }

    public EnumWrapper()
    {
        // Note: Annoyingly, you can't restrict T to an Enum, so we have to check at runtime!
        Type type = typeof(T);
        if (!type.IsEnum)
        {
            throw new ArgumentException("Type must be an enum");
        }
        Array a = Enum.GetValues(type);
        values = a.Cast<T>().ToList();
    }
}

您可以像这样使用它:

 EnumWrapper<SortOrder> SortOptions = new EnumWrapper<SortOrder>();

然后您可以将其作为属性公开并将其用作您的ItemsSource

<ComboBox ItemsSource="{Binding SortOptions}" SelectedValue="{Binding Path=SortBy}"/>
于 2012-10-29T19:19:43.683 回答
1

虽然马特上面的回答在理论上应该有效,但如果您不想制作包装器,您可以使用这个基于 xaml 的代码。它需要你包含在根命名空间中而不是嵌套在一个类中,但除此之外,你可以在你的顶部Enums创建一个并将其绑定到你的.ObjectDataProvider StaticResourceEnumComboBox

<UserControl x:Class="TestApplication.DatabaseTable"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             xmlns:local="clr-namespace:TestApplication"
             mc:Ignorable="d" Width="Auto" Height="Auto">
    <UserControl.Resources>
        <ObjectDataProvider ObjectType="{x:Type sys:Enum}" MethodName="GetValues" x:Key="SortOrderProvider">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:SortOrder" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </UserControl.Resources>
        <DataGrid x:Name="grid" ItemsSource="{Binding ItemsSource}" AutoGenerateColumns="True">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Order" ItemsSource="{Binding Source={StaticResource SortOrderProvider}}" SelectedItemBinding="{Binding SortBy, Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>
</UserControl>
于 2012-10-30T11:51:34.157 回答