两个用户控件(一个包含另一个)与MVVM之间的通信

时间:2016-04-14 11:26:48

标签: c# wpf mvvm

我正在使用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

1 个答案:

答案 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 MontinCSharpcorner with an example