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).你知道这些工具是如何为我们做的吗?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
3712 次 |
| 最近记录: |