2014-06-16 24 views
0

我有我的应用程序启动并与CM运行。 shell视图包含多个ContentControl,它本身包含视图。这些按惯例分配,因为它们的名称与视图模型中的属性匹配。Caliburn.Micro新窗口不遵循约定

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

我已经试图在窗口上设置cal:View.ApplyConventions="True"但这也没有帮助。我也使用ViewModelBinder.Bind(viewmodel, view, null)绑定虚拟机和查看窗口之前显示 - 也不工作。

如何确保我打开的窗口(模态对话框)使用相同的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; } 
    } 
} 

构造函数运行,视图模型创建(NOT 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可以重新启用。

+0

这可能有助于看到一些代码。 DataContext是否在窗口本身是正确的,并且预期的视图是否至少可以正确显示? – Chris

+0

@Chris我加了一些代码。是显示窗口的视图 - 只是其ContentControls的内容而已。 – ZoolWay

回答

1

我认为您的HistoryViewModel需要成为导体才能使其工作。既然你希望两个子虚拟机同时显示,你可以从Conductor.Collection.AllActive继承。

约翰

+0

如果是这样的话,为什么我不必为'ShellViewModel'(意味着应用程序启动时的主视图)做到这一点? – ZoolWay

+0

你的'ShellViewModel'是从哪里继承的? = o – Chris

+0

@ZoolWay:因为ShellViewModel是由Bootstrapper直接调用的,它会将它打开的任何虚拟机看作是Conductor。有关此行为的说明,请参阅http://caliburnmicro.com/documentation/composition。 – jbiddle