2011-03-25 84 views
6

我正在使用WPF应用程序,并且我正在合并使用必须对事件作出反应的动态内容的DataGrid。将枚举绑定到DataGrid组合框视图

我有以下视图模型对包含DataGrid

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来处理字符串枚举字符串转换。

感谢

回答

9

拉枚举出你的视图模型

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}}" /> 
+0

大!奇迹般有效!!! – TheJediCowboy 2011-03-25 20:24:33

+0

快速问题,有没有办法根据该DataGrid项目在组合框上设置选定的项目? – TheJediCowboy 2011-03-25 20:32:44

+1

请参阅编辑更新的'ItemsSource'和'SelectedItem'。基本上,你只需将SelectedItem绑定到绑定DataGrid中的行的任何东西。该属性需要是OfType FieldTypes。 – 2011-03-25 21:22:36

1

看看是这样的:

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

我想这一点,我仍然无法得到它的显示枚举值,感谢 – TheJediCowboy 2011-03-25 19:31:39

0

对于任何人还在寻找答案:
.NET 4.5你只需要物业类型的枚举。 DataGrid会自动为您创建组合框。
事情是这样的:

public enum FieldTypes 
{ 
    Constant, 
    Variable, 
} 

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