recolha ligam Silverlight a caixa de combinação em DataForm usando MVVM
-
10-07-2019 - |
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?
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
-
Digamos User.MembershipRoleId deve ser obrigado a Aspnet_Role.RoleId
-
Dataform é obrigado a ObjectB
- Combobox em DataForm é preenchida com List
-
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}" .... />