按照MVVM模式动态创建控件



我想在我的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"最终将是一个文本框,复选框或组合框:

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控制可以帮助我使UI更快?

  • 我可以用编程方式定义数据注释吗?例如,在解析自定义属性后,我可以向属性添加一些数据注释(Display, Validation)并将其绑定到DataForm, PropertyGrid或有用的控件上吗?

谢谢。

在这些情况下,您通常使用从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,它为CustomProperties集合中的每个CustonProperty都包含一个标签和一个文本框。

相关内容

  • 没有找到相关文章

最新更新