将枚举绑定到DataGrid ComboBox视图

7

我正在使用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来处理字符串-枚举-字符串转换的类。谢谢。
2个回答

10
将枚举从您的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}}" />

快速问题,是否有一种方法可以根据DataGrid项目设置ComboBox上的选定项? - TheJediCowboy
1
请参见更新的ItemsSourceSelectedItem。基本上,您只需要将SelectedItem绑定到用于绑定DataGrid中行的任何内容即可。该属性需要是FieldType类型。 - Metro Smurf

1

看一下类似于:

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

我尝试了这个,但仍然无法显示枚举值,谢谢。 - TheJediCowboy

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