2012-10-29 42 views
0

我有一個模型類,像這樣:麻煩填充一個組合框

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

     public enum SortOrder 
     { 
      Unsorted, 
      Ascending, 
      Descending 
     } 

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

,且含有組合框爲一列,像這樣一個DataGrid:

<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中的列。他們都成功地填充,除了組合框列。有任何想法嗎?

+0

所以它看起來像你綁定'ComboBox'屬性'AttributesModel',*不是'IEnumerable',是嗎? – McGarnagle

+0

實際上包含在其中的枚舉。我也有其他的領域,它沒有任何問題。 –

回答

1

雖然上述馬特的答案應該在理論工作,但我如果你不想做一個包裝,你可以使用這個基於xaml的代碼。它需要將Enums包含在根名稱空間中,而不是嵌套在類中,但除此之外,只需在Enum之上創建一個ObjectDataProviderStaticResource並將其綁定到您的ComboBox即可。

<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> 
2

ItemsSource必須是一個集合。你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}"/> 
+0

我爲ComboBox設置的屬性如何?這些有效嗎? –

+0

@DotNET:假設DataContext已經是你的'AttributesModel'類的一個實例並且'SortOptions'是'EnumWrapper ' –

+0

@MattBurland類型的一個屬性,我認爲你的EnumWrapper構造函數代碼有一個錯字它。它沒有采用任何Type參數,但是你的例子將它傳入。我也猜測你的意圖是儘可能地寫出「令人討厭的是,你不能限制T ......」:) +1。 – Maverik