课程之间的事件彼此不认识? (MVVM)

时间:2016-12-14 15:00:38

标签: c# wpf mvvm event-handling

再次我^^

我搜索了论坛,但我认为我没有找到适合我需求的解决方案。 我得到了一个带有MainViewModel的MainView,并用一种​​MVVM Windowopener(委托)打开一个新窗口MediaPlayerView。此MediaPlayerView具有另一个MediaPlayerViewModel作为DataContext。我的问题是,我如何在MainViewModel中处理来自MediaPlayerView的事件?即如果我的MediaPlayerView.Closed事件被触发,我希望我的MainViewModel做一些事情,但我的MediaPlayerView是通过委托制作的,而不是"知道" ViewModel也没有反过来。我可以重写它以满足我的需求吗?

这里是我在这里找到的代表代码:

public interface IWindowFactory<T>
{
     void CreateNewWindow(T t);
}
public class MediaPlayerWindowFactory : IWindowFactory<string>
{
    public void CreateNewWindow(string directLink)
    {
         MediaPlayerView window = new MediaPlayerView(directLink);
         window.Show();
    }
}

然后用我的MainViewModel打开我的窗口

private readonly MediaPlayerWindowFactory windowFactory;
openMediaPlayerWindow(link);

private void openMediaPlayerWindow(string link)
{
    windowFactory.CreateNewWindow(link);
}

如果这不起作用,您能否告诉我在MVVM中打开Windows的另一种方法是支持事件处理?

1 个答案:

答案 0 :(得分:1)

  

我如何在MainViewModel中处理MediaPlayerView中的事件?   如果我的MediaPlayerView.Closed事件被触发但我的MediaPlayerView [...]没有&#34;知道&#34;我希望我的MainViewModel做一些事情。 ViewModel也是反过来的

显而易见的答案是:通过他们都知道的第三方

第三方可以是专业服务,也可以是像Prism EventAggregator这样的普通服务。重要的是只有想要通信的两个视图模型才能获得相同的服务实例。

所以路线基本上是这样的:

MediaPlayerView.Closed - &gt; MediaPlayerViewModel.ClosedCommand - &gt; ThirdParty - &gt; MainViewModel.ReactToTheEvent

它可以像这样连线:

internal class MediaPlayerViewModel
{
    public MediaPlayerViewModel( IEventAggregator eventAggregator )
    {
        MediaPlayerClosedCommand = new DelegateCommand( () => eventAggregator.GetEvent<MediaPlayerClosedEvent>().Publish() );
    }

    public ICommand MediaPlayerClosedCommand { get; }
}

internal class MainViewModel
{
    public MainViewModel( IEventAggregator eventAggregator )
    {
        eventAggregator.GetEvent<MediaPlayerClosedEvent>().Subscribe( ReactToTheEvent );
    }

    private void ReactToTheEvent()
    {
        // do something
    }
}

public class MediaPlayerClosedEvent : PubSubEvent
{
}

System.Windows.Interactivity中的某处MediaPlayerView加上<i:Interaction.Triggers> <i:EventTrigger EventName="Closed"> <i:InvokeCommandAction Command="{Binding MediaPlayerClosedCommand}"/> </i:EventTrigger> </i:Interaction.Triggers>

{{1}}