Caliburn如何在内部视图中从外部视图处理操作

时间:2013-04-17 14:52:54

标签: c# mvvm caliburn

我有一个非常令人沮丧的问题: 我有一个外部视图,顶部有一个Ribbonbar。还有另一个View,它包含1 ... n Viewmodels并显示来自Datatables列表的数据网格。显示哪一个取决于用户。 用户可以选择功能区上的按钮,该按钮应对数据网格中的选定行发出操作。但是怎么做呢? 我可以轻松地在活动的ViewModel上启动一个方法,但是该方法需要获取所有选定的行 - 这将违反MVVM背后的理念。 任何想法?

以下是屏幕外观: http://s7.directupload.net/file/d/3228/a3m3ttu9_jpg.htm

按钮“Zeile raus”,应该在右下方Tabcontrol中包含的ViewModel / Viwe中产生效果。效果需要知道选择了哪些行。

1 个答案:

答案 0 :(得分:0)

让按钮从命令执行方法发布事件:

public class RibbonViewModel {  
    IEventAggregator events;  

    public RibbonViewModel (IEventAggregator events){  
        this.events = events;  
    }  

    public void ButtonClickCommandExecute(){  
        events.Publish(new SomeMessage{  
            SomeNumber = 5,  
            SomeString = "Blah..."  
        });  
    }  
}

每个ViewModel都应订阅此事件,如果它是“活动”ViewModel,则对其做出反应:

public class ViewModelWithDataGrid : IHandle<SomeMessage>{  
    public void Handle(SomeMessage message){  
        if(IsActive){           
        //do something with the message  
        }
    }  
}

这样,事件源不会耦合到事件接收器,只要VM响应事件,您就可以轻松地进行单元测试。

文档:http://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator&referringTitle=Documentation