2016-04-14 63 views
0

我正在开发一个带有MVVM,.NET Framework 4.6.1和C#的WPF。MVVM与两个用户控件(一个包含其他)之间的通信

我有两个用户controlers,一个在另一个里面一个:

<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

反正有FirstControlViewModelStartBatchViewModel

+0

您不必使用第三方框架。看看命令模式:https://en.wikipedia.org/wiki/Command_pattern,并最终使用某种控制器注入您的视图模型 – Daltons

回答

2

在视图模型和许多观点之间进行交流的方式有很多,这点是最好的。你可以看到它是如何做的:

在我看来,最好的办法是使用棱镜框架的EventAggregator模式。棱镜简化了MVVM模式。然而,如果你还没有使用过棱镜,你可以使用Rachel Lim的教程 - simplified version of EventAggregator pattern by Rachel Lim。我强烈建议你Rachel Lim的方法。

如果使用雷切尔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的简化appr oach是我见过的最好的方法。但是,如果你想创建一个大的应用程序,那么你应该阅读这个article by Magnus MontinCSharpcorner with an example

+0

是的,我没有使用任何框架。 – VansFannel

+0

@VansFannel如果你不想使用第三方MVVM框架。 1)实现你自己的Messenger类。 2)使用事件,并让虚拟机订阅彼此的事件。这就是说; MVVM不仅仅是一个实现INotifyPropertyChanged的类。这是一个由多个部分组成的设计模式,使者是其中的一部分。使用第三方框架比试图推出自己的产品更简单。 – StepUp

+0

@VansFannel记住,如果你不使用框架,并且你想观察MVVM模式,你最终必须自己实现框架的所有核心功能,你认为哪种更好,使用经过同行评审的开源框架,或者由您自己重新创建代码中的所有功能? – StepUp