我正在构建一个复杂的UI应用程序,其中一个窗口包含一个控件,该控件是绘制节点的有向非循环图(DAG)的Canvas。因为那个窗口相当复杂(因为我首先对WPF一无所知),我想我会使用CustomControl(而不是用户控件,因为我认为用户控件被用来将事物组合在一起)。我正在尝试构建的应用程序应该遵循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}}" ...
虽然这对我来说听起来像个傻瓜......
答案 0 :(得分:2)
问题#1:该类是ViewModel吗?我不了解GraphControl类在宏MVVM故事中的作用。
没有。 GraphControl
只是属于视图的另一个控件。内置控件的示例包括TextBox
,Button
和ListBox
等几个。你的GraphControl
只是另一种控制。
视图模型是控件绑定的内容。有关MVVM设计模式的基本介绍以及每个组件的角色,请参阅MSDN:https://msdn.microsoft.com/en-us/library/hh848246.aspx。
问题2:当我将它添加到我的主应用程序时,我必须执行以下操作:
您可以通过这种或那种方式设置控件的DataContext
。最常见的方法是将父窗口的DataContext
设置为视图模型的实例,例如:
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
除非将DataContext
属性显式设置为其他内容,否则子元素将继承元素树中其父元素的DataContext
。
这意味着您的控件将继承其父面板的DataContext
,而父面板将继承其父元素中的DataContext
,依此类推。
以下内容将控件的DataContext
设置为自身,这意味着您可以绑定到GraphControl
类的任何属性,而无需指定显式来源:
<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...>
是否要这样做取决于您的要求。
答案 1 :(得分:1)
回答你问题的最好方法是解释MVVM
M是数据模型,它控制对数据的访问,即指向Web服务,数据库,文件等的链接
V是View,它控制如何从用户收集数据并显示给用户
VM是2之间的接口,它从需要向用户显示的模型中收集数据并处理来自用户的输入,在将数据保存到模型之前验证并执行业务检查
所以回答你的第一个问题控件是他们收集的视图元素并向用户显示数据,如果他们正在做其他事情那么你已经破坏了MVVM
回答您的第二个问题,如果您已正确构建控件,则添加它的方式与添加任何其他控件(如ListView或Button)的方式相同,如何将数据输入控件取决于您的构建方式,如果这意味着您将其设计为绑定在datacontext上那么那就是你要做的事情然后绑定到你在控件代码文件中设置的正确依赖属性