C# 超宽带协议与Caliburn.Micro

C# 超宽带协议与Caliburn.Micro,c#,caliburn.micro,uwp,C#,Caliburn.micro,Uwp,我创建了一个示例UWP项目,并在其基础上添加了Caliburn.Micro 3.0 beta1 使用SplitView,我可以在按下窗格按钮时添加新的ViewModel: ShellView <Button x:Name="OpenSecondView" Margin="24" Content="My Second View" /> <Button Name="btnStartAction" HorizontalAlign

我创建了一个示例UWP项目,并在其基础上添加了Caliburn.Micro 3.0 beta1

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

ShellView

 <Button x:Name="OpenSecondView"
         Margin="24"
         Content="My Second View" />
<Button Name="btnStartAction"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        RelativePanel.AlignHorizontalCenterWithPanel="True"
        RelativePanel.Below="btnInformation"
        Style="{StaticResource button}">
public ShellViewModel(WinRTContainer container)
{
  _container = container;      
}

public void SetupNavigationService(Frame frame)
{
  _navigationService = _container.RegisterNavigationService(frame);
}
不幸的是,当我点击它时,什么也没发生

我应该设置什么

更新

嗯,发生了一些奇怪的事情

如果我在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>

Caliburn Micro约定功能使用x:Name指令而不是Name属性

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

有关简单容器的详细信息请参见。

请注意,如果您决定实施需要缓存viewmodel以便稍后恢复的挂起和恢复操作,则可能会出现与ShellView和Window.Current.Contents不正确地设置到恢复的视图而不是ShellView页面相关的问题。此问题的解决方法。

我尝试了两种方法(x:Name和Name),如果我不设置DataContext,它们将不起作用。@Nestor很抱歉听到,ViewModelBinder似乎没有相应地将视图的DataContext设置为ViewModel。我已经尝试添加自定义ViewModel/View,如果我不将自定义ViewModel注册到WinRTContainer(在App.xaml code behind中的Configure方法),操作绑定将不起作用,那么您是否将MainViewModel注册到WinRTContainer?顺便说一句,名称也适用于约定,很抱歉给了您错误的信息,我应该如何向WinRTContainer注册我的ViewModel?XAML有一个如下的
RegisterNavigationService
绑定:
。我还应该设置什么?@Nestor我已经更新了答案,我希望你能让它工作。是的,那是缺少的部分。它现在可以在没有显式初始化的情况下工作。谢谢,我接受你的回答。那么建议的解决方案是什么?现在没有。目前,作为一种潜在的解决方法,该表正在检查Window.Current.Content是否已设置(非null),然后找到某种方法重新初始化框架。这是未经测试的。
public ShellViewModel(WinRTContainer container)
{
  _container = container;      
}

public void SetupNavigationService(Frame frame)
{
  _navigationService = _container.RegisterNavigationService(frame);
}
<Button x:Name="btnStartAction"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    RelativePanel.AlignHorizontalCenterWithPanel="True"
    RelativePanel.Below="btnInformation"
    Style="{StaticResource button}">
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;

  }
}