我的应用程序中有一个ViewModel
/// <summary>
/// The sample view model
/// </summary>
public class SampleViewModel: ViewModelBase
{
public SampleViewModel(IApplicationBarService applicationBarService)
{
this.applicationBarService = applicationBarService
this.ApplicationBarService.AddButton("Add Bookmark", new Uri("Images/favs-toadd.png", UriKind.Relative), this.OnAddPnrBookmark);
}
/// <summary>
/// Gets or sets the application bar service.
/// </summary>
public IApplicationBarService ApplicationBarService { get; set; } }
IApplicationBarService的实现看起来像这样
/// <summary>
/// The application service.
/// </summary>
public class ApplicationBarService : IApplicationBarService
{
/// <summary>
/// Gets the application bar.
/// </summary>
public IApplicationBar ApplicationBar
{
get
{
var currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content as MainPage;
if (currentPage != null && currentPage.ApplicationBar == null)
{
currentPage.ApplicationBar = new ApplicationBar();
}
if (currentPage != null)
{
return currentPage.ApplicationBar;
}
return null;
}
}
/// <summary>
/// The add button.
/// </summary>
/// <param name="title">
/// The title.
/// </param>
/// <param name="imageUrl">
/// The image url.
/// </param>
/// <param name="onClick">
/// The on click.
/// </param>
public void AddButton(string title, Uri imageUrl, Action onClick)
{
var newButton = new ApplicationBarIconButton()
{
Text = title,
IconUri = imageUrl,
};
newButton.Click += (sender, e) => onClick.Invoke();
this.ApplicationBar.Buttons.Add(newButton);
}
}
我正在将应用程序栏注入视图模型,并且示例视图模型驻留在可移植库中,而应用程序栏服务实现是手机本机。
当我运行应用程序时,代码在
处失败var currentPage =((PhoneApplicationFrame)Application.Current.RootVisual).Content as MainPage;
因为RootVisual为null,因此我无法通过添加按钮 this.ApplicationBarService.AddMethod
我的猜测是,如果我使用绑定到页面上的按钮的RelayCommand初始化应用程序栏,则必须对页面未加载进行操作,因为相同的代码可以正常工作。
我见过其他一些帖子(Windows Phone 8 Application Bar Button Long Tap Event) 其中PhoneApplicationPage的ApplicationBar属性绑定到ViewModel,但我无法实现,因为我的视图模型驻留在可移植类库中。
任何帮助表示感谢。
答案 0 :(得分:1)
我通过为Loaded事件添加事件触发器来解决这个问题
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding SampleViewModel.InitAppBar}" />
</i:EventTrigger>
</i:Interaction.Triggers>
SampleViewModel.InitAppBar包含动态添加按钮的代码,这次对ApplicationBar的引用不为null且代码正常工作