Динамическое создание элементов управления по шаблону MVVM - PullRequest
3 голосов
/ 11 сентября 2011

Я бы хотел динамически сгенерировать некоторые элементы управления в моем приложении 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?Если я проанализирую CustomProperties во ViewModel и выясню, какие элементы управления должны быть созданы, как я могу создать новые элементы управления в моем представлении на основе шаблона MVVM.

  • Есть ли какой-нибудь элемент управления silverlight, который может помочь мне сделать интерфейс быстрее?

  • Можно ли программно определять аннотации данных?например, после анализа пользовательского свойства, можно ли добавить некоторые аннотации данных (Display, Validation) к свойству и связать его с DataForm, PropertyGrid или полезным элементом управления для этой ситуации?

Спасибо.

1 Ответ

3 голосов
/ 14 сентября 2011

В этих случаях вы обычно используете один из элементов управления, наследуемых от 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.

...