我有使用Caliburn.Micro框架的Windows Phone 8应用程序,我需要多个应用程序栏。有一个应用程序栏很容易。我只是将以下代码添加到我的XAML中并自动绑定:
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<cal:AppBarButton IconUri="/Images/appbar.edit.rest.png" Text="edit mode" Message="SwitchToEditMode"/>
<shell:ApplicationBar.MenuItems>
<cal:AppBarMenuItem Text="test" Message="Test"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
然后我尝试用另一个替换应用栏:
NewBar = new ApplicationBar();
var btn1 = new AppBarButton();
btn1.IconUri = new Uri("/Images/appbar.check.rest.png", UriKind.RelativeOrAbsolute);
btn1.Text = "get old bar";
btn1.Message = "SwitchToOldBar";
NewBar.Buttons.Add(btn1);
(GetView() as MyPage).ApplicationBar = EditBar;
此代码更改应用程序栏,但新栏不会对命令作出反应。应用程序栏按钮的单击处理程序也为空。我可以添加自己的处理程序并完成它但它违背了MVVM精神。如何将新应用程序栏绑定到Caliburn.Micro中的现有视图模型?
更新 这是我的最终解决方案,在语法上看起来与初始代码没有什么不同。我有点不高兴XAML使用“消息”和后面的代码使用点击处理程序,但它的工作原理。这是更新的代码:
NewBar = new ApplicationBar();
var btn1 = new AppBarButton();
btn1.IconUri = new Uri("/Images/appbar.check.rest.png", UriKind.RelativeOrAbsolute);
btn1.Text = "get old bar";
// Original line: btn1.Message = "SwitchToOldBar";
btn1.Click += (sender, e) => { this.SwitchToOldBar(); };
NewBar.Buttons.Add(btn1);
(GetView() as MyPage).ApplicationBar = EditBar;
答案 0 :(得分:1)
您无法在Windows Phone Silveright中找到应用栏,因为它不是真正的Silverlight元素。有一些第三方解决方案,例如Bindable Application Bar。
因为应用栏是“不同的”#34; Caliburn AppBarButton上的Message属性仅在页面导航到时进行评估。创建一个Caliburn AppBarButton就是代码。
我建议在按钮外面使用一个事件处理程序,无论它是否是可绑定的,并使用DataContext将该调用调用到视图模型中。
这仍然在MVVM精神之内,只是你自己将视图和视图模型连接在一起。