Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
.net 将财产从一个转移到另一个”;“视图”;到其他视图';MVVM中的视图模型_.net_Wpf_Mvvm_Design Patterns - Fatal编程技术网

.net 将财产从一个转移到另一个”;“视图”;到其他视图';MVVM中的视图模型

.net 将财产从一个转移到另一个”;“视图”;到其他视图';MVVM中的视图模型,.net,wpf,mvvm,design-patterns,.net,Wpf,Mvvm,Design Patterns,我是MVVM新手,有点小问题。我有两个用户控件:父控件和子控件(带有视图、视图模型、模型类)。并且需要将一些属性从父级传递给子级。目前,我通过编写这样的代码来管理它: public static readonly DependencyProperty CallbackActionProperty = DependencyProperty.Register("CallbackAction", typeof (Action), typeof (Chi

我是MVVM新手,有点小问题。我有两个用户控件:父控件和子控件(带有视图、视图模型、模型类)。并且需要将一些属性从父级传递给子级。目前,我通过编写这样的代码来管理它:

public static readonly DependencyProperty CallbackActionProperty =
                DependencyProperty.Register("CallbackAction", typeof (Action), 
        typeof (ChildView), new PropertyMetadata(default(Action)));

public Action CallbackAction
{
  get { return (Action) GetValue(CallbackActionProperty); }
  set
  {
    SetValue(CallbackActionProperty, value);
    ((ChildViewModel)this.DataContext).CallbackAction = value; // Change ViewModel property too
  }
}
这是
ChildView
中的依赖属性,在它的集合上,我还设置了它的
ViewModel
属性。之后,我从
ParentView
访问该依赖项属性,并设置
CallbackAction
->以在子视图模型中设置
CallbackAction

代码:

childUc
是用户控件,位于父控件上,由
ChildView
表示。 代码很难看,所以我希望在不破坏模式方面看到更好的实践。
谢谢。

不要在
dependencProperty
的setter或getter中编写任何逻辑,因为它是由框架以其他方式调用的,而不是直接通过set/get访问器调用的。这是必须遵守的规则

还串

((ChildViewModel)this.DataContext).CallbackAction = value; 
在当前视图和基础ViewModel类型之间引入了绑定耦合,这不是MVVM原则


在视图依赖的情况下,您应该考虑使用XAML中的绑定传递属性,否则PARTENVIEW模型应该通过构造函数注入一个CopyVIEW模型。因此,它们的设计应该表明ParentViewModel有一个子模型…

是的-这段代码非常难看。事实上,我正在努力弄清楚它到底是做什么的

MVVM模式的主要租户之一是ViewModel应该是可单元测试的,并且应该可以在没有视图的情况下执行它。当遇到这种问题时,只考虑视图模型而忽略视图

您的ParentViewModel有一个对ChildViewModel的引用,您可以通过让ParentViewModel在创建ChildViewModel时提供对自身的引用,使其成为双向关系。这意味着您可以从ChildViewModel对ParentViewModel执行任何公共方法

记住这一点,你应该能够解决你的问题


(另外,您不应该在依赖项属性getter或setter中添加逻辑,根据您的依赖项属性值的设置方式,此代码可能会被调用,也可能不会被调用。)

@Mario Vernari,我试图描述的东西的正确方法是什么。嗯,建议不错!当然,我可以创建父接口并将该接口类型的引用传递给子接口(我可以为该子接口提供许多“不同”的父用户控件)。谢谢,我试试看。我认为关于只考虑ViewModel的建议是最好的。当然,它必须在没有视图的情况下工作。是的,向ChildViewModel传递一个只有它应该能够调用的方法的接口听起来是个不错的主意。孩子们永远不应该知道谁是他们的家长,但家长知道。如果您想从任何后代向上“传达”某些信息,应该使用命令。这允许在没有任何耦合的情况下向祖先交换数据。@MarioVernari我强烈反对!如果您有一个OrderViewModel和OrderLineViewModel,它们具有父关系=>子关系,那么它们紧密耦合并且关系是双向的并没有什么错。您是否希望在任何其他上下文中使用OrderViewModel?不当然,一个命令可能会让你觉得你在使用更优雅的代码,但是在视图模型中从子对象到父对象的直接调用要简单得多,也更容易理解。也许我不理解这个问题,但是如果你耦合了两个VM,我也同意这是完全正确的。在上面的问题中,这个家伙指的是一个视图和一个视图模型……要么我不能正确阅读,要么我会保持解耦。完全尊重任何其他观点!
((ChildViewModel)this.DataContext).CallbackAction = value;