再次我^^
我搜索了论坛,但我认为我没有找到适合我需求的解决方案。 我得到了一个带有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的另一种方法是支持事件处理?
答案 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}}