2017-12-07 25 views
0

異なるビューを実装しているタブページがありますが、ナビゲートするときに各タブを初期化できません。私がしたので、何PRISM Xamarin - タブ付きページで作業する(IActiveAware)

<TabbedPage.Children>  
    <tabPages:Page1/> 
    <tabPages:Page2/> 
    <tabPages:Page3/> 
</TabbedPage.Children> 

は、プリズムのドキュメントが現在アクティブなタブページを知るために提案されているようIActiveAwareを使用することでした。だから私は、このクラスを持っている:

public abstract class TabbedChildViewModelBase : BaseViewModel, IActiveAware, INavigationAware, IDestructible 

protected bool IsInitalized { get; set; } 

    private bool _IsActive; 
    public bool IsActive 
    { 
     get 
     { 
      return _IsActive; 
     } 
     set 
     { 
      SetProperty(ref _IsActive, value, RaiseIsActiveChanged); 
     } 
    } 

    public event EventHandler IsActiveChanged; 

    public virtual void OnNavigatingTo(NavigationParameters parameters) 
    { 

    } 

    protected virtual void RaiseIsActiveChanged() 
    { 
     IsActiveChanged?.Invoke(this, EventArgs.Empty); 
    } 
    public virtual void Destroy() 
    { 

    } 
} 

だから、各子ビューモデルは、子ビューモデルベースを継承します

public class Page1 : TabbedChildViewModelBase 
{ 
    public CurrentSeaServiceViewModel() 
    { 
     IsActiveChanged += HandleIsActiveTrue; 
     IsActiveChanged += HandleIsActiveFalse; 
    } 

    private void HandleIsActiveTrue(object sender, EventArgs args) 
    { 
     if (IsActive == false) 
     { 
      TestLabelOnly = "Test"; 
     } 

     // Handle Logic Here 
    } 

    private void HandleIsActiveFalse(object sender, EventArgs args) 
    { 
     if (IsActive == true) return; 

     // Handle Logic Here 
    } 

    public override void Destroy() 
    { 
     IsActiveChanged -= HandleIsActiveTrue; 
     IsActiveChanged -= HandleIsActiveFalse; 
    } 
} 

問題は、初期化されていないVM子です。私はまだあなたが独自のビューモデルにページをバインドする必要がありchildtabbedviewmodel仕事をするために、残念ながらIActiveAwareを使用し、適切にIActiveAwareを実装するために必要なものはありもIsActiveプロパティに

答えて

0

を起動します。

だからここに私がやったことだ:

<TabbedPage.Children> 
     <views:ChildPage1> 
      <views:ChildPage1.BindingContext> 
       <viewModels:ChildPage1ViewModel/> 
      </views:ChildPage1.BindingContext> 
     </views:ChildPage1> 
     <views:ChildPage2> 
      <views:ChildPage2.BindingContext> 
       <viewModels:ChildPage2ViewModel/> 
      </views:ChildPage2.BindingContext> 
    </views:ChildPage2> 
</TabbedPage.Children> 

私は、現在アクティブになっているものを知っているだろうタブIActiveAwareを使用して、プロパティ私の意見のBindingContextと を使用。誰もがタブの子ページをバインドするのに問題があることを知っている人を助けたいと思っています。

+0

いいえ、子ビューにViewModelocator添付プロパティを追加するだけです。あなたが今やっているやり方は、あなたのVMにサービスを注入するためにはうまくいかないでしょう。 –

+0

'prism:ViewModelLocator.AutoWireViewModel =" True "'これはこれでしょうか? Prismには申し訳ありません。 RegisterTypes()内の 'App.xaml'にある各子ビューのビューモデルを登録していれば自動的に配線されませんか? –

+0

それだけです!いいえ、RegisterTypesは配線を行わず、VMLにどのVMを使用するかを伝えます。 –

関連する問題