我正在使用MVVM,.NET Framework 4.6.1和C#开发WPF。
我有两个用户控制器,一个在另一个内:
<Grid x:Name="gridStartBatch" Margin="30" Grid.RowSpan="6" Grid.ColumnSpan="3" Visibility="{Binding GridStartBatchVisibility}">
<local:StartBatch x:Name="userControlStartBatch" />
</Grid>
我显示StartBatch
用户控件更改GridStartBatchVisibility
值。
在StartBatchViewModel
我有三个属性要传递给FirstControlViewModel
,我还要通知FirstControlViewModel
更改GridStartBatchVisibility
值以隐藏StartBatch
是否可以从FirstControlViewModel
访问StartBatchViewModel
?
答案 0 :(得分:2)
在视图模型和许多要点之间进行通信的方法有很多,最重要的是这一点。你可以看到它是如何完成的:
在我看来,最好的方法是使用Prism框架的EventAggregator模式。 Prism简化了MVVM模式。但是,如果您没有使用过Prism,可以使用Rachel Lim的教程 - simplified version of EventAggregator pattern by Rachel Lim。我强烈推荐你Rachel Lim的方法。
如果你使用Rachel Lim的教程,那么你应该创建一个公共类:
public static class EventSystem
{...Here Publish and Subscribe methods to event...}
将事件发布到OptionViewModel:
eventAggregator.GetEvent<ChangeStockEvent>().Publish(
new TickerSymbolSelectedMessage{ StockSymbol = “STOCK0” });
然后您在另一个MainViewModel的构造函数中订阅一个事件:
eventAggregator.GetEvent<ChangeStockEvent>().Subscribe(ShowNews);
public void ShowNews(TickerSymbolSelectedMessage msg)
{
// Handle Event
}
Rachel Lim的简化方法是我见过的最佳方法。但是,如果您想创建一个大型应用程序,那么您应该阅读此article by Magnus Montin和CSharpcorner with an example。