在MVVM方法中简化ICommand / RelayCommand

时间:2012-03-29 15:23:27

标签: mvvm icommand

我正在推动自己使我编写的应用程序变得更简单,我已经采取了一些措施来做到这一点,但我留下了一个有趣的问题,根本不觉得它对我来说是独一无二的。我想知道我做错了什么。

我有一个ViewModel,它保存了一组模型对象。视图是一个ListView,它显示集合中的所有对象。模型对象具有操作它们的所有逻辑。在每个项目的ListView行中,我有一个按钮,并且需要连接该按钮以调用模型对象上的方法。

要使其工作,我需要添加一个命令绑定,但是要向父窗口数据上下文传递一个模型对象的参数,所有这些都可以在ViewModel中使用模型对象(父窗口)窗口数据上下文)在传入的模型对象上调用方法。

这似乎要比它需要的复杂得多。我愿意抛弃我已经做过的任何东西,没有神圣的奶牛,我只是希望用一种简单的方法来完成,这种方法很容易在一年内回顾并弄清楚我在做什么。

2 个答案:

答案 0 :(得分:0)

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
    Path=DataContext.MyCommand}

答案 1 :(得分:0)

在ViewModel中为模型对象创建一个presenter类,并拥有这些类的集合。然后,您可以将ICommand属性放在那些属性上,并传递对要在父datacontext中调用的方法的引用。

可能类似以下内容:

public class ModelPresenter : INotifyPropertyChanged
{
    private Model _model;

    public ModelPresenter(Model model, Action<Model> parentAction)
    {
        _model = model
        _action = parentAction;
    }

    public ICommand MyAction
    {
        get { return new RelayCommand(() => _parentAction(_model)); }
    }

    ...
}

听起来您可能会绑定模型的属性视图。如果模型没有实现INotifyPropertyChanged(请参阅:http://support.microsoft.com/kb/938416/en-us),则不应该这样做,因为它可能导致内存泄漏。