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