我在将视图加载到ContentControl时遇到了一些麻烦。我试图保持这个尽可能简单,所以我使用了CM附带的Hello项目。我确保Hello项目正确编译并运行。它显示一个带有文本框和按钮的窗口。文本框和按钮都在运行时连接到示例ViewModel。
我修改了ShellView.xaml并将GridPanel控件替换为Grid控件,并使用4行和单列设置网格。我将文本框分配给第一行,将按钮分配给第二行,然后将两个单独的ContentControl分配给最后两行。
<Grid Width="800" Height="600">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" x:Name="Name" />
<Button Grid.Row="1" Grid.Column="0" x:Name="SayHello" Content="Click Me" />
<ContentControl Grid.Row="2" Grid.Column="0" x:Name="TopMenu"
VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
<ContentControl Grid.Row="3" Grid.Column="0" x:Name="BottomMenu"
VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
</Grid>
我在ViewModels文件夹中创建了两个独立的C#类,它们是ViewModel,分别称为TopMenuViewModel.cs和BottomMenuViewModel.cs。这两个类都扩展了PropertyChangedBase类。这只是模仿示例项目附带的ShellViewModel.cs类。
using System;
using Caliburn.Micro;
namespace TestWithCaliburnMicro.ViewModels
{
/// <summary>
/// Description of BottomMenuViewModel.
/// </summary>
public class BottomMenuViewModel : PropertyChangedBase
{
public BottomMenuViewModel()
{
}
}
我在Views文件夹中创建了两个单独的WPF用户控件,它们是相应的View,分别称为TopMenuView.xaml和BottomMenuView.xaml。我在每个xaml中添加了一个标签,内容为“顶层菜单”或“底层菜单”,以区分两者。
<Grid>
<Label>Bottom Menu View</Label>
</Grid>
在ShellViewModel.cs类中,我创建了两个公共属性,只设置了“get”访问器,以返回相应ViewModel的实例。
private BottomMenuViewModel _bottomMenu;
public BottomMenuViewModel BottomMenu {
get { return _bottomMenu; }
}
private TopMenuViewModel _topMenu;
public TopMenuViewModel TopMenu {
get { return _topMenu;}
}
在任一属性的get访问器中添加中断都会显示调试项目时调用get访问器。我在BottomMenuViewModel.cs类的构造函数中添加了一个简单的语句,例如int x = 0并在该行中添加了一个break,但是从来没有打过break,这对我来说意味着没有调用构造函数,所以真正的类是不是被创造了?
我相信我所做的是非常基本的,并已阅读CM Codeplex网站上的All About Conventions文档,并通过此评论确认了逻辑:Prior question on stackoverflow
希望有人有时间阅读本文,并指出我正确的方向。感谢。
GitHub上的解决方案。注意:使用SharpDevelop 4.x制作 GitHub solution
答案 0 :(得分:0)
在ShellViewModel
的构造函数中实例化视图模型,或者如果您希望稍后实例化它们,则将setter添加到视图模型属性中,并调用NotifyOfPropertyChange
方法通知您的UI这些属性引用已更改。