在MVVM方法中简化ICommand/RerelayCommand



我正在努力让我编写的应用程序变得更简单,我已经采取了一些步骤来做到这一点,但我留下了一个有趣的问题,这个问题对我来说根本不是唯一的。我想知道我做错了什么。

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

为了实现这一点,我需要添加一个命令绑定,但要添加到父窗口数据上下文,该绑定会传递行中模型对象的参数,这样模型对象就可以在ViewModel(父窗口数据语境)中使用,以调用正在传递的模型对象上的方法。

这似乎真的比需要的复杂得多。我愿意放弃我已经做过的任何事情,没有神圣的奶牛,我只想用一种更简单的方法来做这件事,一年后回顾过去,很容易弄清楚我在做什么。

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

在ViewModel中为模型对象创建一个演示者类,并拥有这些对象的集合。然后,您可以将ICommand属性放在上面,并将引用传递给要在父数据上下文中调用的方法。

也许是以下内容:

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)); }
    }
    ...
}

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

最新更新