C# WPF中的设计模式
我正在做我的第一个WPF申请,所以这个问题可能看起来很奇怪。我一直在阅读有关MVVM的文章,到目前为止,它对我来说是有意义的。但是,我不明白的是,如何分离所有XAML 我的意思是:我假设您没有将所有内容都放在MainWindow.xaml中,而只是根据将要使用的内容折叠控件。我认为您需要一个包含其他文件的xaml的容器。这是正确的吗 如何将XAML分离出来,使其不只是一个文件中所有内容的混合体 如何将XAML分离出来,使其不只是一个文件中所有内容的混合体 有很多方法,包括创建一个单独的 例如,如果您想从C# WPF中的设计模式,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我正在做我的第一个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
MSDN上有一个很好的页面。因此,当用户与我的应用程序交互时,我应该在主窗口内容中折叠/可见的各种控件之间切换?@Justin首选模式是使用数据模板,请参阅我的答案。我想你的问题与MVVM模式相关,而不是MVVM模式。很有趣,我来看看。