2016-11-20 48 views
1

我有3个ViewModels,让我们说说ViewModelA,ViewModelB和ViewModelC。 每个视图模型都有相应的视图。MVVM共享事件

在ViewModelA我有一个公共事件,我正在使用发送一些信息。

我希望ViewModelB和ViewModelC订阅ViewModelA的当前/运行实例中的那个事件?

我该怎么做? 如果一个新的ViewModelA我将有一个不同的ViewModelA实例,所以我需要参考当前的ViewModelA ...

注意:我没有使用MVVM Light或其他框架(还没有),因为我没有学习他们,但:) 谢谢。

回答

1

如果要创建从ViewModelA的视图中的新观点,你可以参考传递给这样

var viewModelA = DataContext as ViewModelA; 
var newWindow = new ViewB(viewModelA); 

另一种观点认为那么你就需要有一个属性在ViewModelB

public ViewModelA MyViewModelA { get; set; } 

而在新的观点:

public ViewB(ViewModelA viewModelA) 
{ 
    InitializeComponents(); 
    var viewModelB = DataContext as ViewModelB; 
    viewModelB.MyViewModelA = viewModelA; 
} 

然后你就可以通过MYV访问ViewModelA iewModelA。

我一直这样做,并没有看到任何问题到目前为止。

+0

谢谢,但我想避免这样的代码,我使用MEF导入/导出我的MainViewModel DataContext,然后我使用ViewModelLocator从WPF DataTemplates解析DataContext /视图。不管怎样,谢谢你。 –

1

1)你可以在codeproject上实现这种简单的发布者/订阅者。你会先行一步,因为大多数的框架有类似的东西:

在MVVM点燃它被称为Messenger

在棱有EventAggregator

2)丑陋的解决方案是创建静态事件在ViewModelA中,这种方式不需要参考

+0

我最终创建了一个分离的静态类到我的公共活动,其他viewmodels可以订阅/发布他们的事件,但我会尝试mjay第三个链接的建议...谢谢 –

1

尽管您可以在ViewModels之间传递引用,但它使您的应用紧密耦合,而不是特别可伸缩。同样,如果您决定在将来进行更改,重构的数量会迅速增长,从而使管理更改变得更加困难。

看看PubSub Event框架。这些都包含在您提到的MVVM框架(如PRISM或MVVM-Light)中,但如果您不需要或不需要上述完整框架,则可以随时添加自己的版本。

看看here为简单的没有废话的实现,你应该能够适应你自己的要求。

+0

哼...在这个过程中,我最终创建了一个分离的静态类来声明公共事件,并且每个类都可以发布订阅,并且正在工作......现在,从您的建议中看到第三个选项,我非常喜欢它,我会给试试那个......谢谢。 –