设置ViewModel的属性,通过从主视图打开另一个视图(绑定到另一个ViewModel)

时间:2011-04-03 20:27:35

标签: wpf mvvm binding mvvm-light

我是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

2 个答案:

答案 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中,你只需发送消息。