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