2011-08-08 64 views
2

Im新的MVVM,并有小问题。我有两个用户控件:父和子(有视图,视图模型,模型类)。并且需要将一些属性从父母传递给孩子。现在香港专业教育学院管理它通过写这样的代码:将属性从一个“视图”传递到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 - >,它在Child's ViewModel中设置CallbackAction
代码:

this.Loaded += (sender, args) => childUc.CallbackAction = ((ParentViewModel) this.DataContext).RefreshStatuses; 

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

+0

问题是什么? –

+0

@Mario Vernari,让事情试图描述的正确方法是什么? – 0x49D1

回答

3

是的 - 这段代码很丑。事实上,我正在努力研究它究竟做了什么!

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

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

考虑到这一点,你应该能够解决你的问题!

(同样,你不应该在你的依赖项属性的getter或setter添加逻辑,该代码可能会或可能不会根据您的依赖属性值是如何设置调用。)

+0

嗯,很好的建议!当然,我可以创建Parent的接口并将该接口类型的引用传递给Child(我可以为该子节点创建许多“不同的”父级用户控件)。谢谢,我会尝试。关于思考ViewModel的建议是我认为最好的。当然,它必须没有查看。 – 0x49D1

+0

是的,将一个接口传递给只有它应该能够调用的方法的ChildViewModel听起来像是个好主意。 – ColinE

+1

孩子们永远不应该知道谁是他们的父母,但父母是。如果你想从任何后代向上“沟通”,你应该使用命令。这允许在没有任何耦合的情况下向血统交换数据。 –

1

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

另外串

((ChildViewModel)this.DataContext).CallbackAction = value; 

引入当前查看和底层视图模型类型之间并列耦合,这不是一个MVVM原理。

在View依赖性的情况下,您应该考虑使用XAML中的绑定来传递属性,否则ParentViewModel应该通过构造函数注入一个ChildViewModel。所以他们应该被设计来表示ParentViewModel有一个孩子...

相关问题