在 运行 代码隐藏之前加载 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");
            }        
        }