Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用MVVM方法简化ICommand/RelayCommand_Mvvm_Icommand - Fatal编程技术网

用MVVM方法简化ICommand/RelayCommand

用MVVM方法简化ICommand/RelayCommand,mvvm,icommand,Mvvm,Icommand,我正在努力使我编写的应用程序更简单,我已经采取了一些步骤来做到这一点,但我留下了一个有趣的问题,我觉得这对我来说并不是独一无二的。我想知道我做错了什么 我有一个ViewModel,它保存模型对象的集合。该视图是一个列表视图,显示集合中的所有对象。模型对象中包含用于操作它们的所有逻辑。在每个项目的ListView行中,我都有一个按钮,该按钮需要连接以调用模型对象上的方法 为了实现这一点,我需要向父窗口数据上下文添加命令绑定,该绑定在行中传递模型对象的参数,以便模型对象可以在ViewModel(父窗

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

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

为了实现这一点,我需要向父窗口数据上下文添加命令绑定,该绑定在行中传递模型对象的参数,以便模型对象可以在ViewModel(父窗口数据上下文)中使用,以调用传入的模型对象上的方法


这似乎比实际需要复杂得多。我愿意扔掉我已经做过的任何事情,没有神圣的母牛,我只想用一种更简单的方法来完成,这样一年后就可以很容易地回顾并弄清楚我在做什么。

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

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
    Path=DataContext.MyCommand}
也许是这样的:

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

    ...
}
公共类ModelPresenter:INotifyPropertyChanged
{
私有模型(u模型),;
公共模型演示者(模型模型、动作父动作)
{
_模型
_动作=父母动作;
}
公共ICommand MyAction
{
获取{返回新的RelayCommand(()=>_parentAction(_model));}
}
...
}

听起来您可能正在绑定到视图中模型的属性。您不应该这样做,因为如果您的模型没有实现INotifyPropertyChanged,它可能会导致内存泄漏(请参阅:).

您可以将绑定与指定父窗口的RelativeSource一起使用,然后使用属性DataContext.MyCommand。为什么您的模型不创建一个命令绑定,直接由模型视图中的按钮调用?我也想过这样做,但我很乐意将业务逻辑嵌入到模型中,在模型对象中使用System.Windows(DependencyObject-因此我可以绑定)和System.Windows.Input(ICommand/RoutedCommand)中的部分.NET库似乎是错误的。如果我只是实现它,这正是我要做的,但我的问题不在于如何做到这一点,有一种更简单的方法不那么迟钝。您可以编写一个标记扩展来简化所述绑定的表达式。我现在正在尝试,但理想情况下,我希望标记扩展能够直接访问对象。类似于:
Command={app:CustomExtension Object=CurrentObject,MethodName=MethodName}
我正在努力让它工作。我最终创建了一个自定义的DelegateCommand类(基于Prism类),该类继承自DependencyObject,并将属性声明为DependencyProperties。然后我使用自定义转换器直接绑定到按钮上的Command属性。@Andrew Hi。你能提供一些关于las解决方案的示例吗?我直接绑定到模型,但我选择在我的所有模型元素上强制INotifyPropertyChanged来实现这一点。