2011-03-25 60 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; } 
}