将枚举绑定到DataGrid ComboBox视图

时间:2011-03-25 19:15:32

标签: c# .net wpf

我正在使用WPF应用程序,我正在开发一个DataGrid,它包含了必须对事件做出反应的动态内容的使用等。

我有包含DataGrid的View的以下ViewModel

public class HiddenFieldPanelViewModel
{
    public List<HiddenFieldComponent> HiddenFieldList { get; set; }
    public HiddenFieldComponent Component { get; set; }
    public bool IsVisible { get; set; }
    public enum FieldTypes{Constant,Variable}
    public HiddenFieldPanelViewModel()
    {
        HiddenFieldList = new List<HiddenFieldComponent>();
        IsVisible = false;
    }
}

此模型上适用于此示例的唯一属性是以下枚举属性

public enum FieldTypes {Constant,Variable}

填充DataGrid时我需要做的是将枚举类型绑定到DataGrid单元格中的下拉列表,这里是添加它之后的一个DataGrid集合项的示例 enter image description here

例如,在上图中,我希望它具有两个枚举值 来自FieldTypes枚举。

在我的XAML中,我指定了以下内容:

<DataGridTemplateColumn Header="Field Type" CanUserResize="False">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Height="20" SelectedIndex="0" ItemsSource="{Binding Path=FieldTypes}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Path=Value}"></Label>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

其他列正确绑定数据,但这不是。

我不确定是否有更好的方法去做。我还从IValueConverter编写了一个EnumConverter来处理字符串枚举字符串转换,如果需要的话。

由于

3 个答案:

答案 0 :(得分:10)

将enum拉出ViewModel

public enum FieldTypes
{
  Constant,
  Variable,
}

// Don't forget to set up your INotifyPropertyChanged on your properties
// if they are being used for binding
public class HiddenFieldPanelViewModel
{
    public List<HiddenFieldComponent> HiddenFieldList { get; set; }
    public HiddenFieldComponent Component { get; set; }
    public bool IsVisible { get; set; }

    // removed:
    // public enum FieldTypes{Constant,Variable}

    // will likely want to set up a property such as:
    // public enum FieldTypes {get; set;}

    public HiddenFieldPanelViewModel()
    {
        HiddenFieldList = new List<HiddenFieldComponent>();
        IsVisible = false;
    }
}

这些是您导入xaml的名称空间:

xmlns:local="clr-namespace:NamespaceToYourEnum" 
xmlns:System="clr-namespace:System;assembly=mscorlib"

然后你可以设置一个ObjectDataProvider来绑定Combobox。一些示例XAML:

<Window.Resources>    
    <ObjectDataProvider x:Key="EnumDataProvider" 
                        MethodName="GetValues" 
                        ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:FieldTypes"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

<!-- FieldTypesEnumProperty would be in your ViewModel -->
<ComboBox Height="25"
        SelectedItem="{Binding Path=FieldTypesEnumProperty}"
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" />

答案 1 :(得分:1)

看一下像:

<DataTemplate>
  <ComboBox SelectedValue="{Binding Path=EstimateStatusValueId}"
            ItemsSource="{Binding Path=DataContext.EstimateStatusValueList, 
              RelativeSource={RelativeSource FindAncestor, 
                AncestorType={x:Type UserControl}}}"
            DisplayMemberPath="Description"
            SelectedValuePath="EstimateStatusValueId" />
</DataTemplate>

答案 2 :(得分:0)

对于仍在寻找答案的人:
.net 4.5 中,您只需要具有枚举类型的属性。 DataGrid会自动为您创建组合框 像这样:

public enum FieldTypes
{
  Constant,
  Variable,
}

public class HiddenFieldPanelViewModel
{
  public FieldTypes Types { get; set; }
}