我正在推动自己使我编写的应用程序变得更简单,我已经采取了一些措施来做到这一点,但我留下了一个有趣的问题,根本不觉得它对我来说是独一无二的。我想知道我做错了什么。
我有一个ViewModel,它保存了一组模型对象。视图是一个ListView,它显示集合中的所有对象。模型对象具有操作它们的所有逻辑。在每个项目的ListView行中,我有一个按钮,并且需要连接该按钮以调用模型对象上的方法。
要使其工作,我需要添加一个命令绑定,但是要向父窗口数据上下文传递一个模型对象的参数,所有这些都可以在ViewModel中使用模型对象(父窗口)窗口数据上下文)在传入的模型对象上调用方法。
这似乎要比它需要的复杂得多。我愿意抛弃我已经做过的任何东西,没有神圣的奶牛,我只是希望用一种简单的方法来完成,这种方法很容易在一年内回顾并弄清楚我在做什么。
答案 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),则不应该这样做,因为它可能导致内存泄漏。