2009-12-30 60 views
6

我想了解在2009年11月工具包中實現的DataForm,我無法弄清楚如何將ComboBox綁定到枚舉。有誰知道DataForm如何自動執行此操作?Silverlight DataForm如何自動生成從ComboBox到枚舉的綁定?

背景

首先我創建的類和枚舉,以下this物品並允許數據形來生成字段。 DataForm爲名稱字符串字段生成一個TextBox,並且(我認爲是)用於流派枚舉字段的組合框。

我理解如何自定義DataForm的第一個目標是重現自動生成中產生的內容。我設法做文本框(和DatePicker,從此代碼中排除),但我努力將ComboBox綁定到枚舉。

這裏是班(簡體):

public class Movie 
{ 
    public string Name { get; set; } 
    public Genres Genre { get; set; } 
} 

public enum Genres 
{ 
    Comedy, 
    Fantasy, 
    Drama, 
    Thriller 
} 

,然後在我的MainPage正在做這樣的:

private ObservableCollection<Movie> movies = new ObservableCollection<Movie>(); 

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    Movie movie = new Movie() { Name = "Fred", Genre = Genres.Thriller }; 
    movies.Add(movie); 
    myDataForm.ItemsSource = movies; 
} 

,並在MainPage.xaml中,在網格:

<dataFormToolkit:DataForm x:Name="myDataForm" AutoEdit="False" AutoCommit="False" 
          Header="Foo Movie DB"> 
</dataFormToolkit:DataForm> 

自動生成的東西。當試圖手動生成時,我得到:

<dataFormToolkit:DataForm x:Name="myDataForm" AutoEdit="False" AutoCommit="False" 
          Header="Foo Movie DB"> 
    <StackPanel Orientation="Vertical"> 
     <dataFormToolkit:DataField> 
      <TextBox Text="{Binding Name, Mode=TwoWay}"/> 
     </dataFormToolkit:DataField> 
     <dataFormToolkit:DataField> 
      <ComboBox ItemsSource="{Binding Genres}" 
         SelectedItem="{Binding Genre, Mode=TwoWay}" /> 
     </dataFormToolkit:DataField> 
    </StackPanel> 
</dataFormToolkit:DataForm> 

但ComboBox不起作用。有很多文章都涉及到這一點,但他們提出的很多建議對於自動生成器來說太多了(例如,將ComboBox的子類化以提供SelectedValue)。你知道這些工具是如何爲我們做的嗎?

回答

4

這是的DataForm執行的代碼...

ComboBox comboBox = new ComboBox(); 
FieldInfo[] valueFieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static); 
List<string> valueList = new List<string>(); 
foreach (FieldInfo valueFieldInfo in valueFieldInfos) 
{ 
      Enum value = valueFieldInfo.GetValue(null) as Enum; 
      if (value != 0) 
      { 
       valueList.Add(value.ToString()); 
      } 
} 
comboBox.ItemsSource = valueList; 
return comboBox; 
5

你可以做到這一點使用的IValueConverter:

XAML:從枚舉

  <ComboBox Width="100" Height="30" ItemsSource="{Binding GenreSource,Converter={StaticResource ec}}" 
        SelectedItem="{Binding SelectedGenre, Mode=TwoWay, Converter={StaticResource gc}}"></ComboBox> 


    public class DemoViewModel : ViewModel 
{ 
    public DemoViewModel() 
    { 
    } 

    public Type GenreSource 
    { 
     get 
     { 
      return typeof(Genres); 
     } 
    } 


    private Genres _SelectedGenre; 

    public Genres SelectedGenre 
    { 
     get { return _SelectedGenre; } 
     set 
     { 
      _SelectedGenre = value; 
      OnPropertyChanged("SelectedGrape"); 
     } 
    } 
} 

轉換爲列出組合框:

public class EnumListConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var enumType = (Type)value; 
     var names = new List<string>(); 
     foreach (var fieldInfo in enumType.GetFields(BindingFlags.Static | BindingFlags.Public)) 
     { 
      names.Add(fieldInfo.Name); 
     } 
     return names;    
    } 

,並從字符串轉換回列表:

public class GenreConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (Views.Genres)Enum.Parse(typeof(Views.Genres), value.ToString(), false); 
    } 
} 

你可以在完整的類型名稱傳遞給GenreConverter使這個通用的任何枚舉

+0

看起來你可以使用你的第一個給予好評...好答案。 – mkedobbs 2010-01-12 03:00:18

+0

這是一個很好的,詳細的答案,但我沒有問我該怎麼做,我問DataForm如何做,所以我沒有接受它作爲答案。 – serialhobbyist 2010-01-18 09:59:21

相關問題