Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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
C# MVVM中的自定义控件_C#_Wpf_Mvvm - Fatal编程技术网

C# MVVM中的自定义控件

C# MVVM中的自定义控件,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在构建一个复杂的UI应用程序,其中一个窗口包含一个控件,该控件是一个画布,用于绘制节点的有向无环图(DAG)。因为那个窗口相当复杂(而且因为我一开始对WPF一无所知),所以我想我应该使用CustomControl(而不是用户控件,因为我认为用户控件是用来将事情分组的)。我尝试构建的应用程序应该遵循MVVM 现在,我创建了GraphControl,作为Selector控件的子类 问题#1:该类是ViewModel吗?我不理解grand MVVM故事中GraphControl类的角色 问题#2:

我正在构建一个复杂的UI应用程序,其中一个窗口包含一个控件,该控件是一个画布,用于绘制节点的有向无环图(DAG)。因为那个窗口相当复杂(而且因为我一开始对WPF一无所知),所以我想我应该使用CustomControl(而不是用户控件,因为我认为用户控件是用来将事情分组的)。我尝试构建的应用程序应该遵循MVVM

现在,我创建了
GraphControl
,作为
Selector
控件的子类

问题#1:该类是ViewModel吗?我不理解grand MVVM故事中
GraphControl
类的角色

问题#2:当我将其添加到主应用程序时,我必须执行以下操作:

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

问题#1:该类是ViewModel吗?我不了解GrandMVVM故事中GraphControl类的角色

否。
GraphControl
只是属于视图的另一个控件。内置控件的示例包括
文本框
按钮
列表框
。您的
GraphControl
只是另一种类型的控件

视图模型是控件绑定到的对象。有关MVVM设计模式和每个组件的角色的基本介绍,请参阅MSDN:

问题#2:当我将其添加到主应用程序时,我必须执行以下操作:

<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...
您可以通过各种方式设置控件的
DataContext
。最常见的方法是将父窗口的
DataContext
设置为视图模型的实例,例如:

public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}
子元素在元素树中继承其父元素的
DataContext
,除非
DataContext
属性显式设置为其他属性

这意味着您的控件将继承其父面板的
DataContext
,而父面板又将继承其父元素的
DataContext
,依此类推

下面将控件的
DataContext
设置为自身,这意味着您可以绑定到
GraphControl
类的任何属性,而无需指定显式源:

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

您是否想这样做取决于您的需求

问题#1:该类是ViewModel吗?我不了解GrandMVVM故事中GraphControl类的角色

否。
GraphControl
只是属于视图的另一个控件。内置控件的示例包括
文本框
按钮
列表框
。您的
GraphControl
只是另一种类型的控件

视图模型是控件绑定到的对象。有关MVVM设计模式和每个组件的角色的基本介绍,请参阅MSDN:

问题#2:当我将其添加到主应用程序时,我必须执行以下操作:

<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...
您可以通过各种方式设置控件的
DataContext
。最常见的方法是将父窗口的
DataContext
设置为视图模型的实例,例如:

public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}
子元素在元素树中继承其父元素的
DataContext
,除非
DataContext
属性显式设置为其他属性

这意味着您的控件将继承其父面板的
DataContext
,而父面板又将继承其父元素的
DataContext
,依此类推

下面将控件的
DataContext
设置为自身,这意味着您可以绑定到
GraphControl
类的任何属性,而无需指定显式源:

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


您是否想这样做取决于您的需求。

回答您的问题的最佳方式是解释MVVM

M是数据模型,它控制对数据的访问,即指向Web服务、数据库、文件等的链接

V是视图,它控制如何从用户收集数据并显示给用户

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

因此,为了回答您的第一个问题,控件是视图元素,它们收集并向用户显示数据,如果它们正在执行其他操作,那么您就破坏了MVVM


为了回答第二个问题,如果您正确构建了控件,那么您添加控件的方式与添加任何其他控件(如ListView或Button)的方式相同,那么如何将数据导入控件取决于您构建控件的方式,如果这意味着您将其设计为绑定在datacontext上,那么这就是您要做的,如果没有绑定到控件代码文件中设置的正确依赖属性,那么回答您的问题的最佳方法就是解释MVVM

M是数据模型,它控制对数据的访问,即指向Web服务、数据库、文件等的链接

V是视图,它控制如何从用户收集数据并显示给用户

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

因此,为了回答您的第一个问题,控件是视图元素,它们收集并向用户显示数据,如果它们正在执行其他操作,那么您就破坏了MVVM

为了回答第二个问题,如果您已经正确地构建了控件,那么您添加控件的方式与添加任何其他控件(如ListView或Button)的方式相同,那么您如何将数据获取到控件中取决于您如何构建它,如果这意味着您将其设计为绑定到datacontext上,那么这就是您要做的,如果不是,那么就是bin