2009-12-30 4 views
6

Ich versuche DataForm zu verstehen, wie im November 2009 Toolkit implementiert und ich kann nicht herausfinden, wie man eine ComboBox an ein Enum bindet. Weiß jemand wie das DataForm das automatisch macht?Wie generiert Silverlight DataForm automatisch eine Bindung von einer ComboBox zu einer Enumeration?

Hintergrund

Zuerst habe ich eine Klasse und eine Enum, folgende this Artikel und erlaubt die Dataform, die Felder zu erzeugen. Das DataForm generiert eine TextBox für das Namenszeichenfolgenfeld und (was ich annehmen kann) eine ComboBox für das Feld Genres enum.

Mein erstes Ziel zu verstehen, wie Sie das DataForm anpassen, ist zu reproduzieren, was in der automatischen Generierung erzeugt wird. Ich habe es geschafft, die TextBoxen (und den DatePicker, von diesem Code ausgeschlossen) zu machen, aber ich habe Schwierigkeiten, die ComboBox an die Enumeration zu binden.

Hier sind die Klassen (vereinfacht):

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

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

und dann in Mainpage mache ich das:

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; 
} 

und in der MainPage.xaml im Grid:

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

für das automatisch generierte Zeug. Beim Versuch, es manuell zu generieren, habe ich stattdessen:

aber die ComboBox funktioniert nicht. Es gibt eine Menge Artikel, die dies abdecken, aber es scheint, dass vieles von dem, was sie vorschlagen, zu viel ist, als dass ein Auto-Generator dies tun könnte (z. B. Subclassing von ComboBox, um SelectedValue bereitzustellen). Weißt du, wie die Werkzeuge es für uns tun?

Antwort

4

Dies ist der Code, der Dataform führt ...

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

Sie können diese mit IValueConverter tun:

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"); 
     } 
    } 
} 

Konvertieren von Enum für ComboBox zur Liste:

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;    
    } 

und Konvertieren von String zurück zur Liste:

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); 
    } 
} 

Sie konnten den vollständigen Typnamen zu GenreConverter passieren diese generische

für jede Enum zu machen
+0

Sieht aus wie Sie Ihre erste upvote ... gute Antwort verwenden könnte . – mkedobbs

+0

Es ist eine gute, detaillierte Antwort, aber ich habe nicht gefragt, wie ich das machen könnte, ich habe gefragt, wie das DataForm es macht, also habe ich es nicht als Antwort akzeptiert. – serialhobbyist

Verwandte Themen