动态添加按钮到Windows Phone 8和Windows 8中的应用程序栏。 MVVM

时间:2014-02-25 15:01:22

标签: mvvm windows-phone-8

我的应用程序中有一个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,但我无法实现,因为我的视图模型驻留在可移植类库中。

任何帮助表示感谢。

1 个答案:

答案 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且代码正常工作