在 运行 代码隐藏之前加载 ViewModel
Load ViewModel before running codebehind
我正在尝试为 iOS 应用程序动态创建选项卡。
我已经通过一个带有 shell 导航的变量,它从我们为每个对象创建一个选项卡的数据库中加载项目。
我遇到的问题是代码隐藏在 shell 导航将变量从视图模型传递到代码隐藏之前运行。
视图模型:
{
[QueryProperty(nameof(Number), nameof(Number))]
public class TabbedPageViewModel : BaseViewModel
{
private int _Number;
public TabbedPageViewModel()
{
}
public int Number
{
get => _Number;
set => SetProperty(ref _Number, value);
}
}
代码隐藏:
public partial class TabbedPage : TabbedPage
{
TabbedPageViewModel _viewModel;
public TabbedPage()
{
BindingContext = _viewModel = new TabbedPageViewModel();
InitializeComponent();
LoadTabs();
}
private void LoadTabs()
{
var results = Database.GetAsync(_viewModel.Number).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
}
如何延迟代码隐藏以便 shell 导航在 LoadTabs() 运行之前设置 Number 变量?
你的问题是因为你没有在 BindingContext 之前初始化。
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs();
}
使用构造函数发送号码:
int num = 1;
await Navigation.PushAsync (new TabbedPage (num));
然后
public TabbedPage(int num)
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs(num);
}
private void LoadTabs(int num)
{
var results = Database.GetAsync(num).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
或者如果使用 shell:
[QueryProperty(nameof(Number), "number")]
public partial class TabbedPage : TabbedPage
{
private int _Number;
public int Number
{
get => _Number;
set => SetProperty(ref _Number, value);
}
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs();
}
private void LoadTabs()
{
var results = Database.GetAsync(Number).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
我最终使用了消息中心:
代码隐藏
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
MessagingCenter.Subscribe<TabbedPageViewModel>(this, "NumberChanged", (sender) =>
{ LoadTabs(); }
);
}
视图模型:
public int Number
{
get => _number;
set
{
SetProperty(ref _number, value);
MessagingCenter.Send<TabbedPageViewModel>(this, "NumberChanged");
}
}
我正在尝试为 iOS 应用程序动态创建选项卡。
我已经通过一个带有 shell 导航的变量,它从我们为每个对象创建一个选项卡的数据库中加载项目。
我遇到的问题是代码隐藏在 shell 导航将变量从视图模型传递到代码隐藏之前运行。
视图模型:
{
[QueryProperty(nameof(Number), nameof(Number))]
public class TabbedPageViewModel : BaseViewModel
{
private int _Number;
public TabbedPageViewModel()
{
}
public int Number
{
get => _Number;
set => SetProperty(ref _Number, value);
}
}
代码隐藏:
public partial class TabbedPage : TabbedPage
{
TabbedPageViewModel _viewModel;
public TabbedPage()
{
BindingContext = _viewModel = new TabbedPageViewModel();
InitializeComponent();
LoadTabs();
}
private void LoadTabs()
{
var results = Database.GetAsync(_viewModel.Number).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
}
如何延迟代码隐藏以便 shell 导航在 LoadTabs() 运行之前设置 Number 变量?
你的问题是因为你没有在 BindingContext 之前初始化。
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs();
}
使用构造函数发送号码:
int num = 1;
await Navigation.PushAsync (new TabbedPage (num));
然后
public TabbedPage(int num)
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs(num);
}
private void LoadTabs(int num)
{
var results = Database.GetAsync(num).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
或者如果使用 shell:
[QueryProperty(nameof(Number), "number")]
public partial class TabbedPage : TabbedPage
{
private int _Number;
public int Number
{
get => _Number;
set => SetProperty(ref _Number, value);
}
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
LoadTabs();
}
private void LoadTabs()
{
var results = Database.GetAsync(Number).Result;
foreach (var _result in results)
{
var from = _result.A;
var to = _result.B;
var _title = from + "-" + to;
this.Children.Add(new ContentPage { Title = _title });
}
}
我最终使用了消息中心:
代码隐藏
public TabbedPage()
{
InitializeComponent();
BindingContext = _viewModel = new TabbedPageViewModel();
MessagingCenter.Subscribe<TabbedPageViewModel>(this, "NumberChanged", (sender) =>
{ LoadTabs(); }
);
}
视图模型:
public int Number
{
get => _number;
set
{
SetProperty(ref _number, value);
MessagingCenter.Send<TabbedPageViewModel>(this, "NumberChanged");
}
}