如何用内在的观点来处理外在的行为

本文关键字:处理 观点 何用内 | 更新日期: 2023-09-27 18:09:45

我有一个非常令人沮丧的问题:我有一个外部视图,顶部有一个丝带条。还有另一个视图,它持有1…n视图模型和显示数据表列表中的数据网格。显示哪一个取决于用户。用户可以在ribbon栏上选择一个按钮,该按钮应该对Datagrid中选定的行发出操作。但是怎么做呢?我可以很容易地在活动ViewModel上启动一个方法,但是这个方法随后需要获得所有选中的行——这将违背MVVM背后的思想。什么好主意吗?

屏幕如下:http://s7.directupload.net/file/d/3228/a3m3ttu9_jpg.htm

按钮"Zeile raus",应该在右下角Tabcontrol中包含的ViewModel/view中产生效果。Effect需要知道哪些行被选中

如何用内在的观点来处理外在的行为

让按钮从它的命令执行方法发布一个事件:

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