我的应用程序启动并运行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)。但永远不会访问属性HeaderView
和RecordView
。
要启动它,我使用以下代码:
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 :(得分:1)
我认为您的HistoryViewModel需要成为指挥才能实现这一目标。由于您希望同时显示两个子VM,因此您将从Conductor.Collection.AllActive继承。
约翰