C# 超宽带协议与Caliburn.Micro
我创建了一个示例UWP项目,并在其基础上添加了Caliburn.Micro 3.0 beta1 使用SplitView,我可以在按下窗格按钮时添加新的ViewModel: ShellViewC# 超宽带协议与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
<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;
}
}