2010-08-22 5 views
1

en supposant que je suis arrivé cette fenêtre principale Xmal:Événement MVVM - comment et où dans l'architecture MVVM ils devraient avoir lieu?

<Window x:Class="MVVMTUTRIALS.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:views="clr-namespace:TestMvvm444.Views" 
Title="Window1" Height="300" Width="400" Loaded="Window_Loaded"> 
<Grid> 
    <views:CustomersList x:Name="CustomersList"/> 
    <views:CustomerBoughtList x:Name="CustomerBoughtList"/> 
</Grid> 
</Window> 

et je veux un événement qui prend une règle en CustomersList (en cliquant sur les matières premières cerrtian) pour appeler le CustomerBoughtList (montrer tous cet achat client) à faire somthing si mes q sont:

1. Quel devrait être l'événement? il est raisonnable de penser dans la fenêtre principale?

2.can quelqu'un s'il vous plaît me guider quoi faire?

Je pense que le cœur de mon incompréhension est de savoir comment UserControl de remorquage (s) comunicate entre eux et avec le modèle de vue

lecture de l'ennemi thanku et des notes.

Répondre

1

Il existe plusieurs façons d'y remédier. Voici un couple exprimé en pseudo-code. Tout d'abord, un modèle de vue coordination:

public class CustomersViewModel : ViewModel 
{ 
    public event EventHandler<EventArgs> SelectedCustomerChanged; 

    public ICollection<Customer> Customers 
    { 
     get ... 
    } 

    public CustomerViewModel SelectedCustomer 
    { 
     get ... 
     set ... 
    } 
} 

public class CustomerPurchasesViewModel : ViewModel 
{ 
    public CustomerViewModel Customer 
    { 
     get ... 
     set ... 
    } 

    public ICollection<PurchaseViewModel> Purchases 
    { 
     get ... 
    } 
} 

public class MainViewModel : ViewModel 
{ 
    private CustomersViewModel customers; 
    private CustomerPurchasesViewModel customerPurchases; 

    public MainViewModel(CustomersViewModel customers, CustomerPurchasesViewModel customerPurchases) 
    { 
     this.customers = customers; 
     this.customerPurchases = customerPurchases; 

     // push changes in selection to the customer purchases VM 
     this.customers.SelectedCustomerChanged += delegate 
     { 
      this.customerPurchases.Customer = this.customers.SelectedCustomer; 
     }; 
    } 
} 

En second lieu, en utilisant le médiateur:

public class CustomersViewModel : ViewModel 
{ 
    public ICollection<Customer> Customers 
    { 
     get ... 
    } 

    public CustomerViewModel SelectedCustomer 
    { 
     get ... 
     set 
     { 
      ... 
      eventHub.Publish(new CustomerSelectedMessage(value)); 
     } 
    } 
} 

public class CustomerPurchasesViewModel : ViewModel, ISubscriber<CustomerSelectedMessage> 
{ 
    public CustomerViewModel Customer 
    { 
     get ... 
     set ... 
    } 

    public ICollection<PurchaseViewModel> Purchases 
    { 
     get ... 
    } 

    private void Receive(CustomerSelectedMessage m) 
    { 
     this.Customer = e.Customer; 
    } 
} 

public class MainViewModel : ViewModel 
{ 
    private CustomersViewModel customers; 
    private CustomerPurchasesViewModel customerPurchases; 

    public MainViewModel(CustomersViewModel customers, CustomerPurchasesViewModel customerPurchases) 
    { 
     this.customers = customers; 
     this.customerPurchases = customerPurchases; 
    } 
} 
+0

thanx man mais il ne résout toujours pas mon problème imaginez que j'ai deux commandes usw séparées que je veux communiquer les unes avec les autres quel est le modèle mvvm pour résoudre ce problème –

+0

Il le fait parce que ce ne sont pas les UserControls qui devraient communiquer entre eux, mais leurs modèles de vue. Et ils peuvent le faire de la manière que j'ai mentionnée. –

+0

mmm ... OK c'est une bonne idée, qui r MainViewModel (CustomersViewModel clients, CustomerPurchasesViewModel customerPurchases) arguments? qui les envoie? comment se lient-ils? –

-1

Vous pouvez avoir un modèle d'affichage pour la fenêtre principale qui a deux propriétés de la liste publique que vos contrôles utilisateur peuvent se lier à. Ensuite, lorsque la sélection est modifiée dans la vue, vous pouvez la détecter dans votre liste de modèles et faire tout ce que vous avez besoin de faire avec votre autre liste. Il n'y aurait pas de gestion d'événement dans la vue.