Xamarin:使用社区 Tab​​View 显示两个页面实际上并未正确初始化页面

Xamarin: Using Community TabView to display two pages does not actually initialize the pages properly

我有以下代码 - 它从应用程序容器加载到两个页面中。

然后我使用它们的内容将它们添加到 TabView 项目。但是,由于这种方法不会开始任何类型的“初始化”,我不得不添加 _overviewPageViewModel.OnAppearing();

但是,当数据发生变化时,页面内容根本不会更新。因此我添加了一个消息中心解决方案,它也没有做任何事情。

我知道这已经是一个 hacky 解决方案 - 有谁知道如何在 TabView 中正确显示两个页面,或者至少如何反映更改更新?

public partial class AdminOverviewTab : StyledPage
{
    private ApprovalPage _approvalPage = App.AppContainer.Resolve<ApprovalPage>();
    private OverviewPage _overviewPage = App.AppContainer.Resolve<OverviewPage>();
    private OverviewPageViewModel _overviewPageViewModel = App.AppContainer.Resolve<OverviewPageViewModel>();

    public AdminOverviewTab()
    {
        InitializeComponent();
        _overviewPageViewModel.OnAppearing();
        var ApprovalPage = new TabViewItem()
        {
            Text = "Approval",
            FontSize = 12,
            Content = _approvalPage.Content
        };

        var OverviewPage = new TabViewItem()
        {
            Text = "Overview",
            FontSize = 12,
            Content = _overviewPage.Content
        };

        MessagingCenter.Subscribe<OverviewPageViewModel>(this, "realTimeBalanceUpdate", (sender) =>
        {
            _overviewPage = App.AppContainer.Resolve<OverviewPage>();

            OverviewPage = new TabViewItem()
            {
                Text = "Overview",
                FontSize = 12,
                Content = _overviewPage.Content
            };
            Tab.TabItems[1].Content = _overviewPage.Content;
        });
        Tab.TabItems.Clear();
        Tab.TabItems.Add(ApprovalPage);
        Tab.TabItems.Add(OverviewPage);
        IconImageSource = "overview";
        Title = "Overview";
    }
}

}

您可以使用 INotifyPropertyChanged 来更新您更改的数据。

我制作了一个包含两个选项卡视图项 View1 和 View2 的选项卡视图。在 View2 中有一个带有 Text BindableProperty 的标签。并且在tabview item View2中有一个button。我使用按钮点击事件来更新我更改的数据。

TabView 的代码:

 public class Page8 : ContentPage, INotifyPropertyChanged
{
    private string _str;
    public string str
    {
        get { return _str; }
        set
        {
            _str = value;
            OnPropertyChanged("str");
        }
    }
    public Page8()
    {
        str = "hello";

        var view1 = new TabViewItem()
        {
            Text = "Approval",
            FontSize = 12,
            Content = new View1()

        };

        var v2 = new View2();
        v2.SetBinding(View2.TextProperty, "str");
        Button button = new Button();
        button.Clicked += delegate
        {
            str = "test";
        };

        var view2 = new TabViewItem()
        {
            Text = "Overview",
            FontSize = 12,
            Content = new StackLayout()
            {
                Children =
                {
                    v2,button
                }
            }
        };

        var tabView = new TabView();
        tabView.TabItems.Add(view1);
        tabView.TabItems.Add(view2);
        Title = "Overview";

        Content = tabView;

        this.BindingContext = this;

    }
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs((propertyName)));
    }

}

视图 2:

 Xaml:
   <ContentView.Content>
  <StackLayout>
      <Label x:Name="label" Text="{Binding Text}"  />
       
  </StackLayout>
 </ContentView.Content>



 Code behind:

  public partial class View2 : ContentView
{
    public static BindableProperty TextProperty = BindableProperty.Create(
propertyName: "Text",
returnType: typeof(string),
declaringType: typeof(View2),
defaultValue: string.Empty,
defaultBindingMode: BindingMode.OneWay,
propertyChanged: OnPropertyChanged);


    public string Text
    {
        get
        {
            return (string)GetValue(TextProperty);
        }
        set
        {
            SetValue(TextProperty, value);
        }
    }
    private static void OnPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var contentview = bindable as View2;
        contentview.label.Text = newValue.ToString();

    }
    public View2()
    {
        InitializeComponent();
    }

 
}