Вставить панель инструментов в другое представление - PullRequest
0 голосов
/ 02 июля 2010

Я использую mvvm для моего нового проекта. У меня есть диспетчер сообщений для отправки сообщений между моделями представления, но в одном случае я должен получать сообщения в представлении. Это представление содержит панель инструментов, которая должна содержать панель инструментов, связанную с подробным представлением (например, при редактировании клиента требуется панель инструментов с кнопками Сохранить, Отменить, Повторить, Отмена).

Проблема в том, что я должен подписаться на сообщения внутри представления, чтобы иметь возможность написать это:

broker.Subscribe<AddToolbarPanelMessage>(x=>toolbar.Add(x.Panel));

Но ... Мне пришлось 1) получить представление из контейнера (поэтому не XAML!), Чтобы иметь DI для messageBroker 2) вызвать статический IoC.Container.Resolve (); внутренний конструктор

Вариант 2 сломал конструктор VS2010, поскольку контейнер не настроен в режиме разработки ...

Есть идеи? Представление не видно из viewmodel, я использую статический ViewModelLocator.

1 Ответ

0 голосов
/ 02 июля 2010

В тех случаях, когда мне нужно связаться из моей ViewModel с моим View, я создаю событие в интерфейсе моего ViewModel, и мой View обрабатывает это событие.Ваша ViewModel может подписаться на ваше AddToolbarPanelMessage, а затем вызвать событие, которое обрабатывается вашим представлением.

public interface ICustomerViewModel
{
    event EventHandler AddToolbarPanel;
}

public class CustomerViewModel : ViewModelBase, ICustomerViewModel
{
    public event EventHandler AddToolbarPanel;

    public CustomerViewModel(IMessenger broker) : base(broker)
    {
        broker.Subscribe<AddToolbarPanelMessage>(
        MessengerInstance.Register<AddToolbarMessage>(this, AddToolbarMessageReceived);
    }
    private void AddToolbarMessageReceived(AddToolbarMessage msg)
    {
        var eh = AddToolbarPanel;
        if (eh != null)
            eh.Invoke(this, EventArgs.Empty);
    }
}

Вы можете легко обработать событие в ctor вашего представления ...

public partial class CustomerView : UserControl
{
    public CustomerView()
    {
        InitializeComponent();
        ((ICustomerViewModel)this.DataContext).AddToolbarPanel += CreateToolbarPanel;
    }
    private void CreateToolbarPanel(object sender, EventArgs e)
    {
        // do your stuff
    }
}
...