2017-03-09 61 views
0

我构建了一个复杂的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的我虽然...

+0

恐怕这个问题太宽泛了,不适合。为这样一个相当复杂的场景提供解决方案,同时回答者也应该解释MVVM的基础知识,我想太多了。您应该从理解MVVM背后的原理和理念开始,通过创建像hello-world一样的应用程序,将文本框绑定到viewmodel属性并了解它。由于MVVM严重依赖于框架提供的机制,因此我认为完全不了解您无法完全理解或监督的内容。 –

+0

但是为了给你提供一个提示,你提供的有关'DataContext'的例子是不正确的。 'DataContext'实际上不是您想要用于某个特定目的的项目(如检索节点),而是您指定的控件的根目录。因此,如果您的VM包含深层嵌套的对象,那么您可以指定它,并且嵌入到其中的任何控件都将解析与其相关的绑定。 –

+0

所以你需要写这样的东西: '' 其中'Nodes'是包装此控件的绑定上下文内的属性。 –

回答

2

问题1:是类视图模型?我不明白GraphControl类在大型MVVM故事中的作用。

编号GraphControl只是属于该视图的另一个控件。内置控件的示例包括TextBox,ButtonListBox等几种。您的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,依此类推。

下将控制自身,这意味着你可以绑定到GraphControl类的任何属性,而无需指定明确的源DataContext

<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

无论你想这样做,取决于您的要求。

+0

“是否要这样做取决于您的要求。”要求通常不包括“打破数据绑定如何工作”。这是一种可怕的做法,你应该感到羞耻,因为它暗示它在任何可以接受的地方。羞愧!无论如何,这是一个自定义控件,所以很有可能他会使用控件模板,这意味着他可以使用TemplateBindings绑定到控件的属性。 – Will

+0

你真的说这对于将DataContext属性绑定到元素本身是一种“耻辱” – mm8

+1

@将以这种方式滥用数据上下文通常是一个坏主意,除非你有非常迫切的需求,但没有任何东西被破坏,只是被滥用,并且作为OP说他想要自己的相对来源而不是mm8,那么你的批评就是针对错误的目标 – MikeT

1

回答你的问题,最好的方法是解释MVVM

的M是数据模型,这种控制访问数据,即链接到Web服务,数据库,文件等

的V是视图,其控制如何从用户收集数据并向用户显示数据

VM是2之间的接口,它从模型中收集需要显示给用户的数据并处理来自用户的输入用户在将数据保存到模型之前对数据进行验证和执行业务检查

所以要回答你的第一个问题控制是他们收集视图元素和显示数据给用户,如果他们做其他事情,那么你已经打破MVVM

回答你的第二个问题,如果你已经正确地构建您的控制您添加它的方式与添加其他控件(如ListView或Button)的方式相同,如何将数据导入控件取决于您如何构建它,如果这意味着您将它设计为绑定在datacontext上,那么这就是您如果不是,则绑定到您在控件代码文件中设置的正确的依赖项属性。

+0

是的,我终于明白了。我不需要另一个CustomControls,ItemsControl对我需要做的事情来说很好。 –

+0

模板的力量可能会有点棘手让你的头来回当你从一个winforms envionment – MikeT