Я вижу, что вы пытаетесь сделать. Вы хотите инициализировать свой экземпляр vm, чтобы иметь к нему доступ из своего представления.
Вместо этого:
vm = BindingContext as DashboardPageViewModel;
, что мы можем сделать, это изменить тип существующего BindingContext сделав это:
public partial class DashboardPage
{
new DashboardPageViewModel BindingContext
{
get => (DashboardPageViewModel) base.BindingContext;
set => base.BindingContext = value;
}
public DashboardPage()
{
InitializeComponent();
}
}
теперь вы можете просто получить доступ к BindingContext.DoSomething
, потому что его тип теперь DashboardPageViewModel
.
Теперь, когда все в порядке, ваша модель представления не должна вызываться 4 раз! Что-то здесь не так. Вот контрольный список действий, которые могут вызвать конструктор, вызываемый 4 раза, так как было предоставлено немного больше информации.
- Попробуйте удалить
<NavigationPage.TitleView>
сегмент. - Make убедитесь, что вы переходите на DashboardPage.
- Убедитесь, что у каждого отдельного TabbedPage есть своя собственная модель просмотра.
- Попробуйте удалить
prism:ViewModelLocator.AutowireViewModel="True"
и вручную добавить модель представления в TabbedPage.
Наконец, конструкторы должны быть в состоянии работать очень быстро и должны только использоваться для присваивания переменных или создания экземпляров или очень быстрых операций. То, что вы могли бы сделать, это отделить код в вашей виртуальной машине:
public class DashboardPageViewModel : ViewModelBase
{
IClientAPI _clientAPI;
Dashboards dashboard;
public DashboardPageViewModel(INavigationService navigationService, IClientAPI clientAPI) : base(navigationService)
{
_clientAPI = clientAPI;
}
public void Init()
{
if (CrossConnectivity.Current.IsConnected)
{
var StartDate = DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
var Enddate = DateTime.Now.ToString("yyyy-MM-dd");
if (dashboard == null)
{
dashboard = new Dashboards();
getDashboardData(StartDate, Enddate);
}
}
}
}
, а затем, на ваш взгляд, вы можете добавить этот метод:
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
if(BindingContext == null)
{
return;
}
BindingContext.Init();
}
Надеюсь, это действительно поможет вам.
Примечание: Весь этот код был написан на лету и никогда не компилировался, могут быть некоторые ошибки.