Pergunta

Eu gostaria de gerar dinamicamente alguns controles em meu aplicativo silverlight.
Para ser mais claro, aqui está uma definição simplificada de minha classe:

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; }
}

Cada "CustomProperty" será finalmente uma TextBox, CheckBox ou 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.
}
  • Qual é a melhor maneira de implementar isso usando o padrão MVVM?Se eu analisar CustomProperties em ViewModel e descobrir quais controles devem ser criados, como posso criar novos controles em minha visualização com base no padrão MVVM.

  • Existe algum controle do silverlight que pode me ajudar a tornar a IU mais rápida?

  • Posso definir anotações de dados de maneira programática?por exemplo, depois de analisar a propriedade customizada, posso adicionar algumas anotações de dados (Display, Validation) à propriedade e vinculá-la a um DataForm, PropertyGrid ou um controle útil para esta situação?

Obrigado.

Foi útil?

Solução

Nesses casos, você geralmente usa um dos controles que herdam ItemsControl (por exemplo, ListBox) ou o ItemsControl diretamente.Os controles herdados de ItemsControl permitem definir um modelo para cada item em uma coleção, por exemplo,usando sua amostra (supondo que você tenha acesso ao seu TestClass por meio de um modelo de visualização):

<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>

Este snippet cria um ListBox que contém um rótulo e uma caixa de texto para cada CustonProperty em sua coleção CustomProperties.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top