Xamarin:使用Community TabView显示两个页面实际上并没有正确初始化页面



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

然后使用它们的内容将它们添加到TabView项中。然而,由于这种方法不开始任何类型的"初始化"。我必须加上_overviewPageViewModel.OnAppearing();

但是,当数据更改时,页面的内容根本不更新。因此,我添加了一个消息传递中心解决方案,它也不做任何事情。

我知道这已经是一个hack的解决方案-有人知道如何在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来更新您更改的数据。

我创建了一个tabview,其中包含两个tabview项View1和View2。在View2中有一个带有Text BindableProperty的标签。tabview项目View2中有一个按钮。我使用button click事件来更新我所更改的数据。

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

View2:

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

}

相关内容

最新更新