【问题标题】:Caliburn.Micro wiring a View to a ViewModel for display by a ContentControlCaliburn.Micro 将 View 连接到 ViewModel 以供 ContentControl 显示
【发布时间】:2012-06-20 15:20:09
【问题描述】:

我在将视图加载到 ContentControl 时遇到了一些问题。我试图让这个尽可能简单,所以我使用了 CM 附带的 Hello 项目。我确保 Hello 项目正确编译并运行。它显示一个带有文本框和一个按钮的窗口。文本框和按钮都在运行时连接到示例 ViewModel。

我修改了 ShellView.xaml 并将 StackPanel 控件替换为 Grid 控件,并将网格设置为 4 行和 1 列。我将文本框分配到第一行,将按钮分配到第二行,然后将两个单独的 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# 类,它们是 ViewModels,分别称为 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 并在该行中添加了一个中断,但是中断从未被击中,这对我来说意味着构造函数没有被调用,所以真的是这个类没有创建?

我相信我正在做的事情非常基础,并阅读了 CM Codeplex 网站上的 All About Conventions 文档,并通过以下评论确认了逻辑:Prior question on stackoverflow

希望有人有时间阅读本文并为我指明正确的方向。谢谢。

GitHub 上的解决方案。注意:使用 SharpDevelop 4.x 制作 GitHub solution

【问题讨论】:

  • 你能把解决方案放到github上,我拿过来看看。
  • 你在哪里设置_topMenu_topMenu?因为 Caliburn 不会为您创建 ViewModel。它有两种模式:首先是 ViewModel,然后它会为 viewmodel 创建一个视图,或者在创建 View 时首先创建 View,而 ViewModel 和 caliburn 只需将它们粘合在一起。
  • @nemesv:好点。我遵循仅提供 get 访问器的约定,基于位于此处的示例 HelloScreens 项目:link 以及位于此处的 HelloScreensWPF:link,这表明单独使用 get 访问器来显示视图。 readonly IDialogManager dialogs; public IDialogManager Dialogs { get { return dialogs; } }
  • 您需要在 MainViewModel 或 ShellViewModel 的构造函数中设置 ViewModels(如果您正在使用)。
  • 感谢 Mark W 和 nemesv 的帮助。现在,使用有关设置视图的线索以及此答案中的技术,视图已加载并连接到视图模型:link在我的情况下,我修改了 ShellViewModel 的构造函数,如下所示:public ShellViewModel() { this.BottomMenu = new BottomMenuViewModel(); } 正如建议的那样,我还添加了一组用于加载视图的属性的访问器。 public BottomMenuViewModel BottomMenu { get { return _bottomMenu; } set { _bottomMenu = value; } }

标签: wpf mvvm caliburn.micro


【解决方案1】:

ShellViewModel 的构造函数中实例化您的视图模型,或者如果您希望稍后实例化它们,然后将设置器添加到您的视图模型属性,并调用NotifyOfPropertyChange 方法来通知您的UI这些属性引用已更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多