【问题标题】:PRISM Xamarin - Working with tabbed pages (IActiveAware)PRISM Xamarin - 使用标签页 (IActiveAware)
【发布时间】:2018-05-21 00:48:37
【问题描述】:

我有实现不同视图的标签页,但在导航时我无法初始化每个标签。

<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;
    }
}

问题是,子虚拟机没有初始化。为了正确实施IActiveAware 或启动IsActive 属性是否需要一些东西

【问题讨论】:

    标签: xaml xamarin xamarin.forms prism


    【解决方案1】:

    不幸的是,我仍然使用IActiveAware,要使childtabbedviewmodel 工作,您需要将页面绑定到它自己的视图模型。

    这就是我所做的:

    <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>
    

    我使用了属性BindingContext 我的观点和 使用IActiveAware 我也会知道当前处于活动状态的选项卡。希望任何人在绑定标签的子页面时遇到问题的人都可以提供帮助。

    【讨论】:

    • 不,您只需将 ViewModelocator 附加属性添加到子视图。您现在的做法不适用于将服务注入您的虚拟机。
    • prism:ViewModelLocator.AutoWireViewModel=”True” 会是这个吗?对不起,棱镜新手。如果我在App.xaml 内部RegisterTypes() 上注册每个子视图的视图模型,它不会自动连接吗?
    • 就是这样!不,RegisterTypes 不做接线,它只是告诉 VML 使用哪个 VM。
    猜你喜欢
    • 2011-09-25
    • 2016-11-21
    • 1970-01-01
    • 2017-05-23
    • 2021-02-24
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多