我是WPF和MVVM的初学者,但我正努力在我的应用程序中实现MVVM模式(基本上我是最近转向C#的Java Developer)。我在MVVM中的问题是这种情况:
有两种模式:
class MyObj
{
public string Name {get; set;}
public MyOtherObj OtherObj {get; set;}
//and some other properties
}
class MyOtherObj
{
public int ID{get; set;}
//and some other properties
}
和两个视图模型: 具有MyObj对象的MyObjVM和具有MyOtherObj对象的MyOtherObjVM。 还有一个MyObjView视图,它绑定到MyObjVM并有一个按钮。通过单击此按钮,可以打开另一个带有MyOtherObjVM的View(MyOtherObjView),因为它的DataContext应该打开,关闭第二个视图,MyOtherObjVM中创建的MyOtherObj对象应该在第一个视图中传递给MyObjVM的MyObj对象。
我用谷歌搜索了它,但除了一些像MVVMLight这样的框架之外什么都没找到,但我没有找到好的文档或案例研究。 有没有可能的方法在不使用第三方框架的情况下解决这个问题,或者使用框架是明智的选择? (我的意思是它需要大量代码或者实现起来很简单,因为我更喜欢学习而不是使用框架,但我的时间有限)。最后抱歉我的英语不好:D
答案 0 :(得分:1)
MVVMLight的Messenger或Caliburn.Micro的EventAggregator可以轻松处理Inter-ViewModel通信。我更喜欢Caliburn.Micro的实现,因为它是基于接口而不是直接订阅消息类型。这使得继承基类具有更大的灵活性。
这两者都像各个部件订阅的中央事件总线。这确实可以帮助您发送消息并跨越边界处理它们。
很棒的是,您不需要整个MVVMLight或Caliburn.Micro库来实现这一点。您可以将EventAggregator插入您的项目中。您会发现EventAggregator对许多其他场景非常有用,并且可以启用解耦部分的消息传递。
另一件好事是创建可重用的行为,通过EventAggregator发送消息。这两个功能一起可以实现一些非常好的Blendable场景。
MVVMLight Messenger示例: http://geekswithblogs.net/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx
Caliburn.Micro EventAggregator示例: http://www.codeconfessions.com/2011/03/from-prism-to-caliburn-micro-event-aggregation/
答案 1 :(得分:0)
它似乎与如何从VM打开一个新窗口相同。有一些解决方案。
使用Message,在MVVMLight中,他们称之为mediator,框架中有一个Messenger,如果要打开一个新窗口,可以从View部分注册消息,而在VM中,你只需发送消息。