Динамическое создание элементов управления по шаблону 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», наконец, будет 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, который может помочь мне ускорить пользовательский интерфейс?

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

Спасибо.


person Kamyar    schedule 11.09.2011    source источник
comment
По первому вопросу см. Мой ответ здесь. Это WPF вместо Silverlight, но есть большая вероятность, что вы сможете применить его дословно.   -  person Jon    schedule 11.09.2011
comment
@Jon: спасибо за ссылку. Постараюсь завтра реализовать. Можно ли обновить данные (что-то вроде двусторонней привязки) с помощью шаблонов данных?   -  person Kamyar    schedule 11.09.2011
comment
Конечно, это просто более гибкий способ определения визуального дерева для объекта. Вы можете делать то же самое, что могли бы, если бы это было жестко запрограммировано.   -  person Jon    schedule 11.09.2011


Ответы (1)


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

person AxelEckenberger    schedule 14.09.2011