Silverlight DataForm如何自动生成从ComboBox到枚举的绑定?

ser*_*ist 6 data-binding enums combobox silverlight-3.0 dataform

我正在尝试理解2009年11月工具包中实现的DataForm,我无法弄清楚如何将ComboBox绑定到枚举.有谁知道DataForm如何自动执行此操作?

背景

首先,我创建了一个类和枚举,下面这个文章,并允许数据形生成领域.DataForm为Name字符串字段生成了一个TextBox,并且(我假设是)一个用于Genres枚举字段的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
}
Run Code Online (Sandbox Code Playgroud)

然后在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;
}
Run Code Online (Sandbox Code Playgroud)

并在MainPage.xaml中,在Grid中:

<dataFormToolkit:DataForm x:Name="myDataForm" AutoEdit="False" AutoCommit="False"
                          Header="Foo Movie DB">
</dataFormToolkit:DataForm>
Run Code Online (Sandbox Code Playgroud)

对于自动生成的东西.当尝试手动生成它时,我得到了:

<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>
Run Code Online (Sandbox Code Playgroud)

但ComboBox不起作用.有很多文章介绍了这一点,但似乎他们提出的大部分内容对于自动生成器来说太多了(例如,将ComboBox子类化以提供SelectedValue).你知道这些工具是如何为我们做的吗?

D.R*_*yne 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");
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

从枚举转换为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;            
    }
Run Code Online (Sandbox Code Playgroud)

并从字符串转换回列表:

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将完整的类型名称传递给GenreConverter,以便为任何枚举制作此通用名称


小智 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;
Run Code Online (Sandbox Code Playgroud)