Caliburn.Micro新窗口不遵循惯例

时间:2014-06-16 21:09:24

标签: c# mvvm caliburn.micro

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

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

我已经尝试在窗口上设置cal:View.ApplyConventions="True",但这也没有帮助。我还使用ViewModelBinder.Bind(viewmodel, view, null)绑定 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; }
    }
}

构造函数运行,创建视图模型(非null)。但永远不会访问属性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" />

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

1 个答案:

答案 0 :(得分:1)

我认为您的HistoryViewModel需要成为指挥才能实现这一目标。由于您希望同时显示两个子VM,因此您将从Conductor.Collection.AllActive继承。

约翰