Data binding Silverlight数据表单如何自动生成从组合框到枚举的绑定?

Data binding Silverlight数据表单如何自动生成从组合框到枚举的绑定?,data-binding,silverlight-3.0,combobox,enums,dataform,Data Binding,Silverlight 3.0,Combobox,Enums,Dataform,我试图理解2009年11月工具包中实现的DataForm,但我不知道如何将组合框绑定到枚举。有人知道数据表单是如何自动完成这项工作的吗 背景 首先,我在本文后面创建了一个类和一个枚举,并允许DataForm生成字段。DataForm为Name string字段生成了一个文本框,并为Genres enum字段生成了一个组合框 我理解如何定制数据表单的第一个目的是重现自动生成中生成的内容。我成功地完成了文本框(和日期选择器,从这段代码中排除),但我正在努力将组合框绑定到枚举 以下是课程(简化): 然

我试图理解2009年11月工具包中实现的DataForm,但我不知道如何将组合框绑定到枚举。有人知道数据表单是如何自动完成这项工作的吗

背景

首先,我在本文后面创建了一个类和一个枚举,并允许DataForm生成字段。DataForm为Name string字段生成了一个文本框,并为Genres enum字段生成了一个组合框

我理解如何定制数据表单的第一个目的是重现自动生成中生成的内容。我成功地完成了文本框(和日期选择器,从这段代码中排除),但我正在努力将组合框绑定到枚举

以下是课程(简化):

然后在主页上我会这样做:

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;
}
私有ObservableCollection电影=新ObservableCollection();
已加载私有void UserControl_(对象发送方,RoutedEventArgs e)
{
电影=新电影(){Name=“Fred”,流派=流派.Thriller};
添加(电影);
myDataForm.ItemsSource=电影;
}
在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子类化以提供SelectedValue)。您知道这些工具是如何为我们实现的吗?

您可以使用IValueConverter:

XAML:


您可以将完整的类型名传递给GenreConverter,使其成为任何枚举的通用名称这是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;
ComboBox-ComboBox=新的ComboBox();
FieldInfo[]valueFieldInfos=type.GetFields(BindingFlags.Public | BindingFlags.Static);
列表值列表=新列表();
foreach(valueFieldInfo中的FieldInfo valueFieldInfo)
{
枚举值=valueFieldInfo.GetValue(null)作为枚举;
如果(值!=0)
{
valueList.Add(value.ToString());
}
}
comboBox.ItemsSource=valueList;
返回组合框;

这是一个很好的详细答案,但我没有问我如何做到这一点,我问了DataForm是如何做到的,所以我没有接受它作为答案。
            <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);
    }
}
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;