2011-05-16 3 views
4

pas sûr si mon titre explique bien le problème im ayant.MVVM liaison viewmodel propriété enfant à la propriété viewmodel

Dans ma demande je fais un appel à un service -retrieve une liste de clients. -retire une liste d'organisations.

Ensuite, je lie cette liste de clients à une liste sur mon point de vue.

Dans mon viewmodel j'ai les propriétés suivantes:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers 

propriétés Organisation: OrganisationId, organisationName

propriétés des clients: CustomerID, OrganisationId, CustomerFirstName, CustomerLastName

A l'intérieur du Listbox sur mon point de vue Je veux montrer le nom d'organisation pour chaque client dans la liste. Comment puis-je procéder à la liaison de ce point de vue?

Je veux juste un bloc de texte pour montrer le nom d'organisation pour le client.

+0

Donc, fondamentalement, vous voulez une recherche similaire à la base de données relationnelle du nom en utilisant l'ID? –

Répondre

4

J'Aplatissez le modèle dans un ViewModel client:

class CustomerViewModel : INotifyPropertyChanged 
{ 
    public string OrgName { get; } 
    public string FirstName {get; } 
    public string LastName { get; } 
} 

Alors le ViewModel retourne posséder la collection de clients:

public class StoreViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<CustomerViewModel> Customers { get; } 
} 

Bind la zone de liste à la propriété OrgName sur le CustomerViewModel:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding FirstName}"/> 
       <TextBlock Text="{Binding OrgName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
0

J'emploierait un MultiBinding et un MultiValueConverter pour cela, cela est malheureusement pas possible si vous êtes limité à Silverlight que les balises suggèrent que ...

0

Je suis d'accord avec Ritch que vous devez aplatir le modèle, mais si vous ne voulez vraiment pas faire cela, vous pouvez utiliser un IValueConverter. Dans la liaison où vous voulez que le nom soit affiché, si vous définissez Organisations comme le datacontext d'un autre contrôle, vous pouvez effectuer une liaison d'élément à élément et transmettre le datacontext de l'autre contrôle dans la liaison, et dans le paramètre ConvertirParameter organizationid, puis dans le code Converter utiliser un peu LINQ et retourner le nom que vous voulez

0

Bind la zone de liste à une requête Linq exposée de votre ViewModel.

Public IEnumerable ItemsView 
{ 
get { 
return 
    { 
    from customer in this.Customers 
    from org in this.Organisations 
    where customer.OrganisationId=org.OrganisationId 
    select new { FirstName=customer.FirstName, LastName=customer.LastName, OrganisationName=org.OrganisationName} 

}; 
} 

Ensuite, il suffit de lier la liste dans la réponse de Ritch à cela.

PS. J'écris ceci sur mon téléphone afin que le code ne soit pas parfait.

Questions connexes