C# WPF中的设计模式

C# WPF中的设计模式,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我正在做我的第一个WPF申请,所以这个问题可能看起来很奇怪。我一直在阅读有关MVVM的文章,到目前为止,它对我来说是有意义的。但是,我不明白的是,如何分离所有XAML 我的意思是:我假设您没有将所有内容都放在MainWindow.xaml中,而只是根据将要使用的内容折叠控件。我认为您需要一个包含其他文件的xaml的容器。这是正确的吗 如何将XAML分离出来,使其不只是一个文件中所有内容的混合体 如何将XAML分离出来,使其不只是一个文件中所有内容的混合体 有很多方法,包括创建一个单独的 例如,如

我正在做我的第一个WPF申请,所以这个问题可能看起来很奇怪。我一直在阅读有关MVVM的文章,到目前为止,它对我来说是有意义的。但是,我不明白的是,如何分离所有XAML

我的意思是:我假设您没有将所有内容都放在MainWindow.xaml中,而只是根据将要使用的内容折叠控件。我认为您需要一个包含其他文件的xaml的容器。这是正确的吗

如何将XAML分离出来,使其不只是一个文件中所有内容的混合体

如何将XAML分离出来,使其不只是一个文件中所有内容的混合体

有很多方法,包括创建一个单独的

例如,如果您想从
主窗口.XAML
中拉出一些
XAML
,您可以创建一个名为
MyUserControl.XAML
UserControl
(右键单击项目,添加,新项…,用户控件(WPF)),如下所示:

<UserControl x:Class="WpfApplication1.MyUserControl"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid>
        <TextBlock>This is from a different XAML file.</TextBlock>
    </Grid>
</UserControl>
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:myControls="clr-namespace:WpfApplication1">
    <Grid>
        <myControls:MyUserControl/>
    </Grid>
</Window>
请注意,您需要添加对
UserControl

xmlns:myControls="clr-namespace:WpfApplication1"

当使用Caliburn框架时,您可以使用较小的视图和ViewModels组合应用程序,并拥有一个将所有较小视图绑定在一起的shell。shell将同时显示一个或多个视图,具体取决于您希望应用程序的行为方式。与上面提到的在其他地方硬编码视图/用户控件名称的模式不同,这一点的好处在于,您只需创建一个ContentControl并将其绑定到正确的ViewModel属性,Caliburn就会按照约定为您找到正确的视图

假设您有一个ShellViewModel和一个ShellView,它只是一个空窗口,还有另一个视图/视图模型,您希望在某个点显示在shell中。您不再需要在任何地方实例化视图,只需使用POCO ViewModels对象即可:

public class ShellViewModel : Screen
{
   public ChildViewModel Child { get; set; }

   public void SomeAction()
   {
       Child = new ChildViewModel(); //Or inject using factory, IoC, etc.
   }
}

public class ShellView : Window
{
}

<Window x:Class="WpfApplication1.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:cal="http://www.caliburnproject.org">
    <Grid>
        <ContentControl cal:View.Model="{Binding Child}" />
    </Grid>
</Window>
公共类ShellViewModel:屏幕
{
公共ChildViewModel子{get;set;}
公共行动
{
Child=new ChildViewModel();//或使用工厂、IoC等进行注入。
}
}
公共类ShellView:窗口
{
}

我同意Kevin关于UserControl和Window的回答,所以我只想回答下面的问题:


因此,当用户与我的应用程序交互时,我应该在主窗口内容中折叠/可见的各种控件之间切换

这是一个有效的选择。如果您使用的是大型应用程序,它可能会变得混乱

我使用的其他选项有

  • 在代码背后切换视图;i、 e.在单击事件上,您可以像在WinForms中那样在页面中添加和删除元素。这不是纯粹的MVVM,有些人会从你的喉咙跳下去,但我相信MVVM是一种工具,而不是一种宗教
  • 在ViewModel中提供视图作为属性,并从父视图绑定到它们。我不知道这是否是纯MVVM,当您需要根据复杂条件动态创建视图时,这很好,但它可能会变得复杂
  • 使用DataTemplates,它本质上是根据提供的数据类型确定要使用的视图的规则。因此,如果数据是
    地址
    (或
    地址视图模型
    ),请使用
    地址视图
    。如果数据是
    CustomerView模型
    ,请使用
    CustomerView
    。等等
在我看来,数据模板是首选模式——干净、易于维护,而且是一个不错的标准。去DataTemplate看看绑定是如何工作的并不重要,而我给出的其他两个选项可能会导致意大利面代码落入坏人之手


MSDN上有一个很好的页面。

因此,当用户与我的应用程序交互时,我应该在主窗口内容中折叠/可见的各种控件之间切换?@Justin首选模式是使用数据模板,请参阅我的答案。我想你的问题与MVVM模式相关,而不是MVVM模式。很有趣,我来看看。