2010-07-02 4 views
0

저는 새 프로젝트에 mvvm을 사용하고 있습니다. 뷰 모델간에 메시지를 보낼 메시지 디스패처가 있지만 한 가지 경우에는 뷰에서 메시지를 받아야합니다. 이보기에는 상세보기와 관련된 도구 모음이 포함되어야하는 도구 모음 패널이 있습니다 (예를 들어 고객 편집에는 저장, 실행 취소, 다시 실행, 취소가있는 도구 모음이 필요함). 그래서 (컨테이너에서보기를 가져 오지) ... 을 내가 1이툴바를 다른보기에 삽입하십시오.

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

그러나 :

문제는 내가보기 내부 메시지에 가입해야이 쓸 수 있다는 것입니다 XAML 아님!) messageBroker에 DI를 사용하려면 2) 정적 IoC.Container.Resolve();를 호출합니다. 컨테이너가 디자인 모드로 구성되어 있지 않기 때문에 생성자 내부

옵션 2 ...

어떤 생각을 VS2010 디자이너 파산? View가 viewmodel에서 표시되지 않습니다. 정적 ViewModelLocator를 사용합니다.

답변

0

내 ViewModel에서 내 View로 통신해야하는 경우 ViewModel의 인터페이스에서 이벤트를 만들고 내 View에서 해당 이벤트를 처리하도록합니다. ViewModel은 AddToolbarPanelMessage에 가입 ​​한 다음 뷰에서 처리하는 이벤트를 발생시킬 수 있습니다. 당신은 쉽게보기의의 ctor에서 이벤트를 처리 할 수 ​​

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

... 합의

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

- 내가 메시지 인프라가보기에 사용할 수 갈까요 생각하지 않습니다. 인터페이스와 이벤트를 사용하면 나에게 많은 의미가 있습니다. –

관련 문제