我正在制作我的第一个 WPF 应用程序,所以这个问题可能看起来很奇怪。我一直在阅读有关 MVVM 的内容,到目前为止它对我来说很有意义。但是,我不明白的是分离所有 XAML。
我的意思是:我假设您不会将所有内容都放在 MainWindow.xaml 中,而只是根据将要使用的内容折叠控件。我认为您会想要一个包含其他文件的 xaml 的容器。它是否正确?
您如何将 XAML 分离出来,使其不仅仅是一个文件中所有内容的混搭?
您如何将 XAML 分离出来,使其不仅仅是一个文件中所有内容的混搭?
有很多方法,包括创建一个单独的UserControl
,CustomControl
,Page
或Window
例如,如果您想XAML
从您的MainWindow.xaml
. _ _UserControl
MyUserControl.xaml
<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>
然后MainWindow.xaml
像这样使用这个控件:
<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"
我同意 Kevin 关于 UserControl 和 Window 的回答,所以我将只解决后续问题:
因此,当用户与我的应用程序交互时,我应该在 MainWindow 内容中折叠/可见的各种控件之间切换?
这是一个有效的选择。如果您正在使用大型应用程序,它可能会变得混乱。
我使用的其他选项是
Address
(或AddressViewModel
),请使用AddressView
. 如果数据是CustomerViewModel
,请使用CustomerView
。等等。在我看来,DataTemplates 是首选模式——干净、易于维护和一个很好的标准。去 DataTemplate 看看绑定是如何工作的很简单,而我给出的其他两个选项可能会导致意大利面条代码落入坏人手中。
MSDN在 WPF 中的 DataTemplates上有一个不错的页面。
使用 Caliburn 框架时,您可以使用较小的 Views 和 ViewModels 组成您的应用程序,并拥有一个将所有这些较小视图绑定在一起的 shell。shell 将同时显示一个或多个视图,具体取决于您希望应用程序的行为方式。这样做的好处 - 与上面提到的在其他地方硬编码 View/UserControl 名称的模式不同 - 是您只需创建一个 ContentControl 并将其绑定到正确的 ViewModel 属性,Caliburn 将通过以下方式为您找到正确的 View惯例。
假设你有一个 ShellViewModel 和一个 ShellView,它只是一个空窗口,还有另一个 View/ViewModel,你想在你的 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>