異なるビューを実装しているタブページがありますが、ナビゲートするときに各タブを初期化できません。私がしたので、何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
プロパティに
いいえ、子ビューにViewModelocator添付プロパティを追加するだけです。あなたが今やっているやり方は、あなたのVMにサービスを注入するためにはうまくいかないでしょう。 –
'prism:ViewModelLocator.AutoWireViewModel =" True "'これはこれでしょうか? Prismには申し訳ありません。 RegisterTypes()内の 'App.xaml'にある各子ビューのビューモデルを登録していれば自動的に配線されませんか? –
それだけです!いいえ、RegisterTypesは配線を行わず、VMLにどのVMを使用するかを伝えます。 –