2014-02-25 59 views
1

我有一個視圖模型在我的應用程序動態添加按鈕,應用程序欄在Windows Phone 8的與MVVM

/// <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當前頁=((PhoneApplicationFrame)Application.Current.RootVisual)。內容作爲所述的MainPage應用;

爲RootVisual是零,因此我通過 this.ApplicationBarService.AddMethod

我的猜測是,這必須做一些事情沒有被加載頁面的相同的代碼工作,如果我intialize應用程序我無法添加按鈕Bar使用綁定到頁面上的按鈕的RelayCommand。

我已經看到一些其他線程(Windows Phone 8 Application Bar Button Long Tap Event) 其中PhoneApplicationPage的ApplicationBar屬性綁定到ViewModel,但我無法實現,因爲我的視圖模型駐留在可移植類庫中。

任何幫助表示讚賞。

+0

你能簡單地等待頁面加載嗎? –

+0

是託尼最終多數民衆贊成我所做的,看到下面的答案並驗證 – Abhilash

+0

似乎我不能發表一個答案,直到明天因此使用評論,我想出了這個解決方案使用Interactivity庫,我添加了一個事件觸發器,並將其綁定到命令在我的視圖模型中,我添加了應用程序欄按鈕,它解決了問題 – Abhilash

回答

1

我解決了這個通過添加事件觸發Loaded事件

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <i:InvokeCommandAction Command="{Binding SampleViewModel.InitAppBar}" /> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 

SampleViewModel.InitAppBar包含代碼動態地添加按鈕,這陣子參考應用程序任務欄不爲null,代碼工作

相關問題