Caliburn.Micro 的 UWP 约定

UWP conventions with Caliburn.Micro

我创建了一个示例 UWP 项目,并根据 this tutorial 添加了 Caliburn.Micro 3.0 beta1。

使用 SplitView,我可以在按下窗格按钮时添加新的 ViewModel:

ShellView

 <Button x:Name="OpenSecondView"
         Margin="24"
         Content="My Second View" />

ShellViewModel

public void OpenSecondView()
{
  _navigationService.For<MainViewModel>().Navigate();
}

它加载了正确的视图(所以我认为,惯例有效)。

我在详细视图中有一个按钮,它设置了名称 属性。

主视图

<Button Name="btnStartAction"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        RelativePanel.AlignHorizontalCenterWithPanel="True"
        RelativePanel.Below="btnInformation"
        Style="{StaticResource button}">

我在 ViewModel 中添加了一个同名方法。

MainViewModel

public void btnStartAction()
{
  var x = 2;
}

不幸的是,当我点击它时,没有任何反应。

我应该设置什么?

更新

嗯,奇怪的事情发生了。

如果我在 MainView.xaml.cs 中添加以下行,按钮将起作用:

public MainView()
{
   this.InitializeComponent();
   this.DataContext = new MainViewModel();
}

因此,ViewModel 似乎可以找到它的视图(因此我可以看到它)但是 视图没有 DataContext。

我该怎么办?

更新 2

框架就是这样注册的。

XAML

 <SplitView.Content>
                <Grid>                  
                <Frame Grid.Row="1"
                           DataContext="{x:Null}"
                           cm:Message.Attach="[Event Loaded] = [SetupNavigationService($source)]" />
                </Grid>
  </SplitView.Content>

ShellModelView

public ShellViewModel(WinRTContainer container)
{
  _container = container;      
}

public void SetupNavigationService(Frame frame)
{
  _navigationService = _container.RegisterNavigationService(frame);
}

Caliburn Micro 约定功能使用 x:Name 指令而非名称 属性。

<Button x:Name="btnStartAction"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    RelativePanel.AlignHorizontalCenterWithPanel="True"
    RelativePanel.Below="btnInformation"
    Style="{StaticResource button}">

更新

抱歉给错了信息,Name和x:Name都可以用于约定。

您应该将 MainViewModel 注册为 WinRTContainer

App.xaml.cs

public sealed partial class App
{
  private WinRTContainer _container;

  protected override void Configure()
  {
     _container = new WinRTContainer();
     _container.RegisterWinRTServices();

     _container
          .PerRequest<ShellViewModel>()
          .PerRequest<MyFirstViewModel>()
          .PerRequest<MySecondViewModel>()
          .PerRequest<MyThirdViewModel>()
          .PerRequest<MainViewModel>();

     var navigationManager = SystemNavigationManager.GetForCurrentView();

     navigationManager.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;

  }
}

有关简单容器的更多信息,请参阅 Simple IoC Container

请注意,如果您决定实施需要缓存视图模型以便以后恢复的挂起和恢复操作,则可能会出现与 ShellView 相关的问题,并且 Window.Current.Contents 被错误地设置为恢复的视图ShellView 页面的。正在解决此问题。