我想在我的silverlight应用程序中动态生成一些控件 更清楚的是,这是我班级的简化定义:
public class TestClass
{
[Display(Name="First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
public List<CustomProperty> CustomProperties { get; set; }
}
每个“CustomProperty”最终都是TextBox,CheckBox或ComboBox:
public class CustomProperty
{
public CustomDataType DataType { get; set; } //enum:integer, string, datetime, etc
public object Value { get; set; }
public string DisplayName { get; set; }
public string Mappings { get; set; } // Simulating enums' behavior.
}
使用MVVM模式实现此目的的最佳方法是什么?如果我在ViewModel中解析CustomProperties,并找出应该创建哪些控件,如何在我的视图中基于MVVM模式创建新控件。
是否有任何Silverlight控件可以帮助我加快用户界面?
我可以通过编程方式定义数据注释吗?例如,在解析自定义属性之后,我可以向属性添加一些数据注释(显示,验证)并将其绑定到DataForm,PropertyGrid或这种情况的有用控件吗?
谢谢。
答案 0 :(得分:3)
在这些情况下,您通常会直接使用从ItemsControl
(例如ListBox
)或ItemsControl
继承的控件之一。继承自ItemsControl
的控件允许您为集合中的每个项目定义模板,例如使用您的示例(假设您可以通过视图模型访问TestClass
):
<ListBox ItemsSource="{Binding TestClass.CustomProperties }">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--DataContext is stet to item in the ItemsSource (of type CustomProperty)-->
<StackPanel>
<TextBlock Text="{Binding DisplayName}"/>
<TextBox Text="{Binding Value}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
此代码段会为ListBox
集合中的每个CustonProperty
创建一个CustomProperties
,其中包含标签和文本框。