如何在CaliburnMicro中绑定ApplicationBar?

时间:2015-02-03 17:22:02

标签: c# windows-phone-8 mvvm caliburn.micro

我有使用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;

1 个答案:

答案 0 :(得分:1)

您无法在Windows Phone Silveright中找到应用栏,因为它不是真正的Silverlight元素。有一些第三方解决方案,例如Bindable Application Bar

因为应用栏是“不同的”#34; Caliburn AppBarButton上的Message属性仅在页面导航到时进行评估。创建一个Caliburn AppBarButton就是代码。

我建议在按钮外面使用一个事件处理程序,无论它是否是可绑定的,并使用DataContext将该调用调用到视图模型中。

这仍然在MVVM精神之内,只是你自己将视图和视图模型连接在一起。