2009-11-30 4 views
2

J'ai ce problème, j'ai l'application Silverlight écrite en utilisant MVVM. J'ai besoin de créer DataForm qui est lié à la propriété sur ViewModel et je veux ajouter ComboBox et le remplir avec des valeurs d'autres collections dans le même ViewModel.Silverlight lier la collection à Combobox dans DataForm en utilisant MVVM

code:

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

Tout cela est géré par NewAccountVM qui a ces propriétés:

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

Maintenant, tout cela fonctionne en plus d'ajouter à ItemsSource ComboBox. J'ai trouvé de nombreux exemples montrant comment remplir CB dans CodeBehind, mais comme je l'ai dit, je veux le faire dans MVVM-Style :) Je comprends que ComboBox a hérité DataContext de DataForm, et ItemsSource = "{Binding Path = Languages, Mode = TwoWay} "ne fonctionnera pas, mais je n'ai aucune idée de comment atteindre mon objectif.

Quelqu'un peut-il m'aider?

Répondre

6

1) Déclarez le viewmodel à la vue dans la section ressources.

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

2) Liez le ComboBox à la propriété de collection sur le modèle de vue.

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

Merci, c'est-il :) Je l'ai pensé à elle eriler, mais j'avais problème avec mon ViewModel parce qu'il avait 2 constructeurs, j'ai dû réorganiser la création de mes ViewModels à celle-ci avec des ressources statiques. Merci encore. – michajas

+0

Dans cet exemple, où définissez-vous le ViewModel en tant que DataContext pour UserControl? Je suppose que vous le faites dans le constructeur de l'UserControl, mais je voudrais savoir à coup sûr. –

+0

@michajas Faites attention à la configuration de la VM à l'intérieur des ressources, si votre VM ctor lève une exception, elle sera avalée par une erreur d'analyse XAML. Je suggère fortement de regarder la VM dans l'événement Loaded et d'utiliser un conteneur IoC, pour plus de flexibilité. – Agies

0

vous pouvez définir le contexte des données en XAML à votre ressource statique comme ceci:

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

Scénario A: 1. On suppose que vous souhaitez remplir un combo avec tous les rôles des membres, et permettre au client de choisir le rôle et attribuer à l'utilisateur: -à-dire ObjectA: Aspnet_Role à savoir ObjectB: User

  1. Disons User.MembershipRoleId doit être lié à Aspnet_Role.RoleId

  2. Dataform est lié à ObjectB

  3. Combobox en forme de données est rempli avec Liste
  4. En XAML ÉCRIRE :

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

ici la mise en correspondance est, ObjectB.MembershipRoleId = ObjectA.RoleId

Scénario B: 1. Si vous ne souhaitez pas définir explicitement la manière Scénarioa, alors dans ce cas, définir un ForeignKey- PrimaryKey -> Aspnet_Roles.RoleId 2. Dans le fichier ADO.NET (.edmx), mettez à jour le modèle à partir de la base de données. L'entité utilisateur est associée à l'entité Aspnet_Roles 3.En XAML écrire le code ci-dessous pour lier le combobox, au champ désiré de la Dataform

<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... /> 
Questions connexes