Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
WPF C#MVC/MVP模式和用户控制代码隐藏_C#_Wpf_Model View Controller_Mvp_Code Behind - Fatal编程技术网

WPF C#MVC/MVP模式和用户控制代码隐藏

WPF C#MVC/MVP模式和用户控制代码隐藏,c#,wpf,model-view-controller,mvp,code-behind,C#,Wpf,Model View Controller,Mvp,Code Behind,我正在WPF/WCF/NHibernate/等中开发一个大型ish应用程序,并实现了MVP模式(尽管这个问题仍然与MVC相关)作为核心架构 就核心架构(控制器、视图等)而言,扩展和添加功能以及返回并对某些部分进行更改感觉非常自然 但有时,我创建的自定义用户控件背后的代码让人感觉好像它“打破”了所实现的MVC/MVP范式,因为代码涉及设计中的漏洞,设计涉及代码中的漏洞。让我再次澄清,这仅适用于用户控件。我个人认为这种代码隐藏模式(对于ASP.NET和WPF来说)是一件“坏事”,但不管我怎么看,我还

我正在WPF/WCF/NHibernate/等中开发一个大型ish应用程序,并实现了MVP模式(尽管这个问题仍然与MVC相关)作为核心架构

就核心架构(控制器、视图等)而言,扩展和添加功能以及返回并对某些部分进行更改感觉非常自然

但有时,我创建的自定义用户控件背后的代码让人感觉好像它“打破”了所实现的MVC/MVP范式,因为代码涉及设计中的漏洞,设计涉及代码中的漏洞。让我再次澄清,这仅适用于用户控件。我个人认为这种代码隐藏模式(对于ASP.NET和WPF来说)是一件“坏事”,但不管我怎么看,我还是坚持使用它


在这种情况下,您对最佳实践有何建议?你如何处理这些问题?例如,您是否解决了自定义控件的代码隐藏问题?如果是这样,自定义控件是如何显示内容的。在这方面,它们与按钮或下拉组合框没有什么不同。诀窍是不要让他们直接处理事情。他们需要通过视图界面发送内容,演示者同样需要通过视图界面与他们交互

这样想吧。如果忽略MVP,自定义控件将以特定方式与模型交互。使用MVP所做的就是采用这些方式,并使用视图界面定义它们。是的,您正在添加一个额外的调用层,但优点是您可以完整地记录它如何与系统的其余部分交互。另外,你还可以把它撕下来,换成完全不同的东西。因为所有新的事情需要做的是实现它的视图接口的一部分


如果您有一个具体的例子,我可以更好地说明。

因为您使用的是WPF,所以您应该认真研究该模式。这是本文讨论的(PM)模式的一种形式。WPF非常面向绑定,并为XAML提供了一个非常强大和丰富的数据绑定框架。使用MVVM,您可以完全地、完全地将视图模型与视图分离,从而实现真正的POCO UI开发,从而实现关注点和单元可测试性的最终分离

使用MVVM,您将能够模块化所有视图,包括Windows、用户控件等,并将其与驱动它们的代码分离。除了自动为您生成的代码之外,您不应该在代码背后有任何逻辑。有些事情一开始有点棘手,但是下面的链接应该可以帮助您开始。要学习的关键内容是MVVM模式本身、数据绑定、路由事件和命令以及附加的行为:


WPF+MVVM在前面有一点学习曲线,但是一旦你越过了最初的障碍,你就永远不会想要回头看。WPF和MVVM的可组合性、失去耦合、数据绑定和原始能力令人震惊。您将比以前有更多的自由使用您的UI,并且您几乎不需要真正地处理代码背后的问题。

我碰巧喜欢代码背后的问题(另一个人的看法),但它们只有在它们除了促进控制事件和应用程序其余部分之间的交互之外什么都不做的情况下才能工作。不过,我承认我见过很多反例。我甚至还写了一些

实际上,所有隐藏的代码应该做的就是“哦,有人点击了这个按钮;可能有人想知道这一点。”PRISM(来自MS patterns and practices)为WPF和Silverlight提供了很多架构基础设施;它包括一个发布/订阅接口,允许控件和代码只发布事件,而不知道可能的订阅者,或者订阅者可能对事件做什么。PRISM还为Silverlight添加了命令

WPF和Silverlight的MVC的一个常见变体是MVVM(Model、View、ViewModel)。ViewModel以某种最有用的形式(如ObservableCollections,以方便双向绑定)向用户控件提供数据