mvvm - 将 ContentViews 嵌套到 ContentPage 作为 Xamarin 体系结构的最佳实践
问题描述
我有一个应用程序,它基本上将一堆 ContentViews 加载到主 ContentPage 中。我认为这里存在问题,因为每次加载主页时基本上都需要初始化所有视图模型。我想知道是否值得我放弃下面的代码并将视图从 ContentView 转换为 ContentPage 并执行 Navigation.PushAsync(new View1()); 反而。抱歉,我知道这是很多示例代码,但我真的很想清楚地了解最佳实践。
My Home.xaml
<Grid x:Name="ContentBody" VerticalOptions="FillAndExpand">
<local:View1 Grid.Row="0" x:Name="View1" IsVisible="{Binding View1IsVisible}" BindingContext="{Binding View1ViewModel}" />
<local:View2 Grid.Row="0" x:Name="View2" IsVisible="{Binding View2IsVisible}" BindingContext="{Binding View2ViewModel}" />
<local:View3 Grid.Row="0" x:Name="View3" IsVisible="{Binding View3IsVisible}" BindingContext="{Binding View3ViewModel}" />
<local:View4 Grid.Row="0" x:Name="View4" IsVisible="{Binding View4IsVisible}" BindingContext="{Binding View4ViewModel}" />
<local:View5 Grid.Row="0" x:Name="View5" IsVisible="{Binding View5IsVisible}" BindingContext="{Binding View5ViewModel}" />
<local:View6 Grid.Row="0" x:Name="View6" IsVisible="{Binding View6IsVisible}" BindingContext="{Binding View6ViewModel}" />
<local:DrawerView Grid.Row="0" x:Name="DrawerView" IsVisible="{Binding DrawerViewIsVisible}" />
</Grid>
Then In my HomeViewModel...
private readonly View1ViewModel _view1ViewModel = new View1ViewModel();
public View1ViewModel View1ViewModel { get { return _view1ViewModel; } }
private readonly View2ViewModel _view2ViewModel = new View2ViewModel();
public View2ViewModel View2ViewModel { get { return _view2ViewModel; } }
private readonly View3ViewModel _view3ViewModel = new View3ViewModel();
public View3ViewModel View3ViewModel { get { return _view3ViewModel; } }
private readonly View4ViewModel _view4ViewModel = new View4ViewModel();
public View4ViewModel View4ViewModel { get { return _view4ViewModel; } }
private readonly View5ViewModel _view5ViewModel = new View5ViewModel();
public View5ViewModel View5ViewModel { get { return _view5ViewModel; } }
private readonly View6ViewModel _view6ViewModel = new View6ViewModel();
public View6ViewModel View6ViewModel { get { return _view6ViewModel; } }
///////////////////Some Visibility Properties...//////////////////////
///////////////////Some Visibility Properties...//////////////////////
private bool _view1IsVisible;
public bool View1IsVisible
{
get { return _view1IsVisible; }
set { _view1IsVisible = value; OnPropertyChanged("View1IsVisible"); }
}
private bool _view2IsVisible;
public bool View2IsVisible
{
get { return _view2IsVisible; }
set { _view2IsVisible = value; OnPropertyChanged("View2IsVisible"); }
}
private bool _view3IsVisible;
public bool View3IsVisible
{
get { return _view3IsVisible; }
set { _view3IsVisible = value; OnPropertyChanged("View3IsVisible"); }
}
private bool _view4IsVisible;
public bool View4IsVisible
{
get { return _view4IsVisible; }
set { _view4IsVisible = value; OnPropertyChanged("View4IsVisible"); }
}
private bool _view5IsVisible;
public bool View5IsVisible
{
get { return _view5IsVisible; }
set { _view5IsVisible = value; OnPropertyChanged("View5IsVisible"); }
}
private bool _view6IsVisible;
public bool View6IsVisible
{
get { return _view6IsVisible; }
set { _view6IsVisible = value; OnPropertyChanged("View6IsVisible"); }
}
/////And then this is more or less a method to show the view/////////////
private void ShowView(ViewChangedEventArgs e)
{
HideAllViews();
switch(e.SelectedView){
case ViewType.View1:
View1IsVisible = true
break;
case ViewType.View2:
View2IsVisible = true
break;
case ViewType.View3:
View3IsVisible = true
break;
case ViewType.View4:
View4IsVisible = true
break;
case ViewType.View5:
View5IsVisible = true
break;
case ViewType.View6:
View6IsVisible = true
break;
}
}
有人可以告诉我这种方法是否可以吗?由于每次添加新页面时都使用这种方法,因此我需要将视图添加到主页视图,并将 viewModel 和 IsVisible 属性添加到主页 ViewModel..
我将不胜感激任何有关这方面的指导。我认为更好的方法是将 ContentViews 与 HomePage 分开,当我导航到其中一个视图时,我只需 PushAsync。我在网上看到了一些人采用上述方法的支持文档,我只是想问问专家他们看到这段代码时的想法。
解决方案
在与 Xamarin 团队的成员交谈后,我被告知要从此主页中删除所有视图,将透视视图模型绑定到它们自己的代码后面,然后我可以使用 Navigation.PushAsync(new View1( ));
教程: https ://github.com/XamarinUniversity/XAM290
文档: https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/
推荐阅读
- git - 发行版升级后,mercurial 不会提交 git subrepo
- sql-server - 计算断开间隔 SQL Server 的最小和最大时间
- r - 在R中为时间图绘制多条线
- html - 哪些 HTML 标签及其属性可以加载外部资源?
- python - 是否可以在 Python 中创建随机大小写选择器?
- php - PHP中的Time()函数总是显示相同的值
- java - NotificationManagerCompat 中的 (android.content.Context) 无法应用于
- c - 在具有库的目标主机上开发 Paho-Mqtt-C 应用程序
- azure-active-directory - Azure AD 中 auth\access 令牌请求的限制
- html - Flask 表单不允许我上传 TSV 文件