Как Silverlight DataForm автоматически генерирует привязку от ComboBox до перечисления?

Я пытаюсь понять DataForm, как реализовано в инструментарии в ноябре 2009, и я не могу разработать, как связать ComboBox с перечислением. Кто-либо знает, как DataForm делает это автоматически?

Фон

Сначала я создал класс и Перечисление, после этой статьи и позволил DataForm генерировать поля. DataForm генерировал TextBox для строкового поля Имени и (что я принимаю), ComboBox для поля перечисления Жанров.

Моя первая цель в понимании, как настроить DataForm, состоит в том, чтобы воспроизвести то, что производится в автоматической генерации. Мне удалось сделать TextBoxes (и 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 movies = new ObservableCollection();

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, в Сетке:



для автоматически сгенерированного материала. При попытке генерировать его вручную, я вместо этого добрался:


    
        
            
        
        
            
        
    

но ComboBox не работает. Существует много статей, касающихся этого, но кажется так большой частью того, что они предлагают, слишком много для автогенератора, чтобы сделать (например, разделение на подклассы ComboBox для обеспечения SelectedValue). Вы знаете, как инструменты делают это для нас?

6
задан serialhobbyist 30 December 2009 в 16:01
поделиться

2 ответа

Это код, который 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;
4
ответ дан 10 December 2019 в 02:48
поделиться

Вы можете сделать это с использованием 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");
        }
    }
} 

Преобразовать от Enum в список для Combobox:

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, чтобы сделать этот универсальный для любого Enum

5
ответ дан 10 December 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: