Pergunta

Eu tenho esse problema, eu tenho Silverlight aplicativo escrito usando MVVM. Eu preciso criar DataForm que é binded a propriedade em ViewModel e eu quero adicionar ComboBox e preenchê-lo com valores de outra coleção no mesmo ViewModel.

Código:

<dataFormToolkit:DataForm CurrentItem="{Binding NewUser, Mode=TwoWay}" AutoGenerateFields="False" Height="298">
            <dataFormToolkit:DataForm.EditTemplate>
                <DataTemplate>
                    <StackPanel>

                        <dataFormToolkit:DataField Label="Email">
                            <TextBox Text="{Binding Email, Mode=TwoWay}"/>
                        </dataFormToolkit:DataField>

                        <dataFormToolkit:DataField Label="Język">
                            <ComboBox ItemsSource="{Binding Path=Languages, Mode=TwoWay}"/>
                        </dataFormToolkit:DataField>

                    </StackPanel>
                </DataTemplate>
            </dataFormToolkit:DataForm.EditTemplate>
        </dataFormToolkit:DataForm>

Tudo isso é tratado pelo NewAccountVM que tem estas propriedades:

private User newUser;
    public User NewUser { 
        get 
        { 
            return newUser; 
        }
        set
        {
            if (value != newUser)
            {
                newUser = value;
                RaisePropertyChanged("NewUser");
            }
        }
    }

    private ObservableCollection<Language> languages;

    public ObservableCollection<Language> Languages
    {
        get { return languages; }
        set 
        {
            if (languages != value)
            {
                languages = value;
                RaisePropertyChanged("Languages");
            }
        }
    }

Agora, tudo isso funciona Além de adicionar ItemsSource a ComboBox. Eu encontrei muitos exemplos que mostram como CB preencher CodeBehind, mas como eu disse eu quero fazer isso em MVVM-Style :) Eu entendo que, ComboBox herdou DataContext de DataForm, e este ItemsSource = "{Binding Path = Línguas, Mode = TwoWay}" não vai funcionar, mas não tenho idéia de como alcançar meu objetivo.

Alguém pode me ajudar?

Foi útil?

Solução

1) Declarar a viewmodel à vista na seção de recursos.

<UserControl.Resources>
    <local:MyViewModel x:Key="myViewModel" />
</UserControl.Resources>

2) vincular a caixa de combinação para a propriedade de coleção na viewmodel.

<ComboBox ItemsSource="{Binding Path=Languages, 
                                Source={StaticResource myViewModel}, 
                                Mode=TwoWay}"/>

Outras dicas

Você pode definir o contexto de dados em XAML ao seu recurso estático como assim:

<UserControl.DataContext>
    <Binding Source="{StaticResource myViewModel}" />
</UserControl.DataContext>

Cenário A: 1. Suponha que você deseja preencher um combo com todas as funções de associação, e permitir que o cliente selecione a função e atribuir ao usuário: isto é ObjectA: Aspnet_Role ou seja ObjectB: User

  1. Digamos User.MembershipRoleId deve ser obrigado a Aspnet_Role.RoleId

  2. Dataform é obrigado a ObjectB

  3. Combobox em DataForm é preenchida com List
  4. Em XAML escrever o seguinte:

    <Combobox DisplayMemberPath="RoleName" SelectedValue="{Binding MembershipRoleId,Mode=TwoWay}" SelectedValuePath="RoleId" />

aqui o mapeamento é, ObjectB.MembershipRoleId = ObjectA.RoleId

Cenário B: 1. Se você não quiser definir explicitamente pela forma como ScenarioA, então, nesse caso, definir uma relação ForeignKey-PrimaryKey entre as tabelas no banco de dados como ForeignKey -> User.MembershipId PrimaryKey -> Aspnet_Roles.RoleId 2. A partir do arquivo ADO.NET (edmx), atualizar o modelo do banco de dados, você vai observar que na usuário entidade existe uma associação feita mediante entidade Aspnet_Roles 3. Em XAML escrever o código como abaixo para ligar a caixa de combinação, para o campo desejado do Dataform

<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top