我构建了一个复杂的UI应用程序,其中一个窗口包含一个Canvas控件,该控件绘制了一个有向无环图(DAG)的节点。因为那个窗口相当复杂(并且因为我对WPF一无所知),所以我认为我会使用CustomControl(而不是用户控件,因为我认为用户控件是用来将事物分组在一起的)。我正在尝试构建的应用程序应该遵循MVVM。MVVM中的自定义控件
现在我创建GraphControl
作为Selector
控件的子类。
问题1:那个类是ViewModel吗?我不明白GraphControl
类在盛大的MVVM故事中的角色。
问题2:当我把它添加到我的主要应用程序,我必须做一些事情,如:
<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...
看起来对我来说,我真的不明白这些东西是如何工作的。
帮助?
编辑:显然那个人和我有同样的问题(https://mutelight.org/datacontext-in-a-custom-control)。在文章中给出的解决方案是这样:
<GraphControl><Grid DataContext="{Binding RelativeSource={RelativeSource Self}}" ...
这听起来就像hackish的我虽然...
恐怕这个问题太宽泛了,不适合。为这样一个相当复杂的场景提供解决方案,同时回答者也应该解释MVVM的基础知识,我想太多了。您应该从理解MVVM背后的原理和理念开始,通过创建像hello-world一样的应用程序,将文本框绑定到viewmodel属性并了解它。由于MVVM严重依赖于框架提供的机制,因此我认为完全不了解您无法完全理解或监督的内容。 –
但是为了给你提供一个提示,你提供的有关'DataContext'的例子是不正确的。 'DataContext'实际上不是您想要用于某个特定目的的项目(如检索节点),而是您指定的控件的根目录。因此,如果您的VM包含深层嵌套的对象,那么您可以指定它,并且嵌入到其中的任何控件都将解析与其相关的绑定。 –
所以你需要写这样的东西: ' ' 其中'Nodes'是包装此控件的绑定上下文内的属性。 –