2013-10-10 43 views
2

我想从我的孩子ViewModel事件回传给父母。子viewmodel的视图是一个单独的窗口,我相信我不能传递构造函数参数。该视图上的按钮需要在父视图模型上触发一个方法。ViewModel与事件之间的通信

子视图模型:

public ConnectViewModel(ConnectEvents connectEvents) 
{ 
    ConnectEvents = connectEvents; 
} 

父视图模型

public MainWindowViewModel() 
{ 
    ConnectEvents connectEvents = new ConnectEvents(); 
    ConnectViewModel = new ConnectViewModel(connectEvents); 
    connectEvents.ThrowEvent += ConnectToServer; 
} 

我如何在这两者之间进行沟通?有一个更好的系统,或者我如何让父母订阅孩子?

+0

如果你真的想实现MVVM,你应该看看一个命令模式。 – Tico

+0

是否可以将命令传递给另一个视图模型?他们有不同的dataContexts。 – user547794

+0

这就是它的作用,看看定义:http://en.wikipedia.org/wiki/Command_pattern – Tico

回答

2

沟通 '事件' 通过事件

在你ConnectViewModel ...

public ConnectViewModel(ConnectEvents connectEvents) 
{ 
    public event EventHandler<EventArgs> SomethingHappenedEvent; 

    ... 

    private void DoSomething() 
    { 
      if (SomethingHappenedEvent != null) 
      { 
       SomethingHappenedEvent(this, newEventArgs()); 
      } 
    } 

    RelayComand _somethingCommand; 
    public ICommand SomethingHappenedCommand 
    { 
      get 
      { 
       if (_someethingCommand == null) 
        _somethingCommand = new RelayCommand(DoSomething) 
      } 
    } 
} 

,并在您MainWindowViewModel

public MainWindowViewModel() 
{ 
    ConnectEvents connectEvents = new ConnectEvents(); 
    ConnectViewModel = new ConnectViewModel(connectEvents); 
    ConnectViewModel.SomethingHappenedEvent += HandleSomethingHappened; 
    connectEvents.ThrowEvent += ConnectToServer; 
} 
private void HandleSomethingHappened(object sender, EventArgs e) 
{ 
    // Now your mainviewmodel knows that something happened 
} 
2

你可以使自己的EventAggregator

public static class DumbAggregator 
{ 
    public static void BroadCast(string message) 
    { 
    if (OnMessageTransmitted != null) 
     OnMessageTransmitted(message); 
    } 

public static Action<string> OnMessageTransmitted; 
} 

用法:

public class MySender 
    { 
    public void SendMessage() 
    { 
     DumbAggregator.BroadCast("Hello There!"); 
    } 
    } 

public class MySubscriber 
{ 
    public MySubscriber() 
    { 
    DumbAggregator.OnMessageTransmitted += OnMessageReceived; 
    } 

private void OnMessageReceived(string message) 
{ 
    MessageBox.Show("I Received a Message! - " + message); 
} 
} 

,并用这个你可以与你的视图模型