Событие MVVM - как и где в архитектуре MVVM они должны проходить? - PullRequest
1 голос
/ 22 августа 2010

при условии, что у меня есть это главное окно xmal:

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

, и я хочу, чтобы событие, которое использует правило в CustomersList (щелчок по cerrtian raw), вызывало CustomerBoughtList (показать все покупки этого клиента)Что-то, поэтому мой вопрос:

1. Где должно быть событие?разумно думать в главном окне?

2.может ли кто-нибудь подсказать, что мне делать?

Я думаю, что суть моего недоразумения заключается в том, как буксируемые UserControl (ы) общаются друг с другом и с моделью представления

Спасибо за чтение и создание заметок.

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Существуют различные способы решения этой проблемы.Вот пара, выраженная в псевдокоде.Во-первых, модель координатного представления:

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

Во-вторых, с использованием посредника:

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 голосов
/ 22 августа 2010

У вас может быть модель представления для главного окна, которая имеет два общедоступных списка свойств, к которым могут привязываться ваши пользовательские элементы управления. Затем, когда выбор изменяется в представлении, вы можете обнаружить это в списке моделей вашего представления и сделать все, что вам нужно сделать с другим списком. В представлении не будет обработки событий.

...