【问题标题】:Caliburn.Micro new window does not follow conventionsCaliburn.Micro 新窗口不遵循约定
【发布时间】:2014-06-16 21:09:24
【问题描述】:

我的应用已通过 CM 启动并运行。 shell 视图包含多个 ContentControl,它们本身包含视图。这些是按约定分配的,因为它们的名称与视图模型中的属性匹配。

我有一个 WPF 窗口(至少它的类继承自 Window),它是从我的应用程序中使用 windowManager.ShowDialog(viewModel) 打开的。在这个窗口中,我再次有 ContentControls,但它们没有绑定到视图模型属性。

我已经尝试在窗口上设置cal:View.ApplyConventions="True",但这也无济于事。我还使用ViewModelBinder.Bind(viewmodel, view, null) bind vm 并在显示窗口之前查看 - 也不起作用。

如何确保我打开的窗口(模式对话框)使用相同的 CM 增强功能?

这是视图:

<Window x:Class="Client.Views.History.HistoryView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
    Title="Historie" Height="300" Width="300"
                   cal:View.ApplyConventions="True"
    >
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="64" />
        <RowDefinition Height="*" />
        <RowDefinition Height="20" />
    </Grid.RowDefinitions>
    <ContentControl x:Name="HeaderView" Grid.Row="0" Grid.Column="0" />
    <ContentControl x:Name="RecordView" Grid.Row="1" Grid.Column="0" />
    <Border Grid.Row="2" Grid.Column="0" Background="DarkKhaki" BorderThickness="2" BorderBrush="DarkSeaGreen"  />
</Grid>
</Window>

显示边框以便加载视图。 DataContext 应该由 caliburn micro 设置。这是视图模型:

public class HistoryViewModel : PropertyChangedBase
{

    #region Fields --------------------------------------------------------

    private readonly HeaderViewModel headerView;
    private readonly RecordViewModel recordView;

    #endregion

    public HistoryViewModel()
    {
        this.headerView = IoC.Get<HeaderViewModel>();
        this.recordView = IoC.Get<RecordViewModel>();
    }

    public HeaderViewModel HeaderView
    {
        get { return this.headerView; }
    }

    public RecordViewModel RecordView
    {
        get { return this.recordView; }
    }
}

构造函数运行,视图模型被创建(不为空)。但是属性HeaderViewRecordView 永远不会被访问。

要启动它,我使用以下代码:

HistoryViewModel viewModel = IoC.Get<HistoryViewModel>();
windowManager.ShowDialog(viewModel);

它在像这样显式绑定模型时起作用:

<ContentControl x:Name="HeaderView" cal:View.Model="{Binding HeaderView}" Grid.Row="0" Grid.Column="0" />
<ContentControl x:Name="RecordView" cal:View.Model="{Binding RecordView}" Grid.Row="1" Grid.Column="0" />

但我想知道如何重新启用标准机制

【问题讨论】:

  • 查看一些代码可能会有所帮助。窗口本身的DataContext 是否正确,并且预期的视图至少显示正确吗?
  • @Chris 我添加了一些代码。是的,窗口的视图已显示 - 仅显示其 ContentControls 的内容。

标签: c# mvvm caliburn.micro


【解决方案1】:

我认为您的 HistoryViewModel 需要成为导体才能使其正常工作。由于您希望两个子虚拟机同时显示,因此您将继承自 Conductor.Collection.AllActive。

约翰

【讨论】:

  • 如果是这样,为什么我不必为ShellViewModel(即应用启动时的主视图)这样做?
  • 您的ShellViewModel 继承自什么? =o
  • @ZoolWay:因为 ShellViewModel 由 Bootstrapper 直接调用,它将打开的任何 VM 视为导体。有关此行为的说明,请参阅caliburnmicro.com/documentation/composition
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多