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 页面的。正在解决此问题。
我创建了一个示例 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 页面的。正在解决此问题。