如何将 View 类中的代码片段移动到 OnAppearing() 方法?

Posted

技术标签:

【中文标题】如何将 View 类中的代码片段移动到 OnAppearing() 方法?【英文标题】:How can I move code snippet in View class to OnAppearing() method? 【发布时间】:2021-08-28 06:58:53 【问题描述】:

我正在尝试将视图页面中视图的属性绑定到名为 ViewModel 的地毯中的类,然后在名为 Model 的地毯中从另一个名为 Category(模型)的类的实例访问属性.问题是它似乎不起作用。尽管 .codes 中没有错误代码,但我在运行应用程序时无法访问绑定。我得到的警告是:找不到 SelectedCategory .CategoryName 绑定的数据上下文。我想尝试 OnAppearing 方法来解决这个问题,但我不知道该怎么做。根据我的研究,我需要将以下代码移动到 OnAppearing 方法,但我不能。 cvm = new CategoryViewModel(category); this.BindingContext=cvm 我想把这些代码 sn-ps 移到 OnAppearing 方法中。你有什么建议吗?谢谢!!

1.CategoryViewModel.cs

public class CategoryViewModel:BaseViewModel


    private   Category _SelectedCategory;
    public Category SelectedCategory
    
        set
        
            _SelectedCategory = value;
            OnPropertyChanged();
        
        get
        
            return _SelectedCategory;
        
    




    public ObservableCollection<ProductItem> ProductItemsByCategory  get; set; 

   private  int _TotalProductItems;
    public int TotalProductItems
    
        set
        
            this._TotalProductItems = value;
            OnPropertyChanged();
        
        get
        
            return this._TotalProductItems;
        
    

    public CategoryViewModel( Category category)
    
        SelectedCategory = category;
  

        ProductItemsByCategory = new ObservableCollection<ProductItem>();
     

        GetProductItems(category.CategoryID);

    

     async void GetProductItems(int categoryID)
    
        var data = await new ProductItemService().GetProductItemsByCategoryAsync(categoryID);

        ProductItemsByCategory.Clear();
        foreach (var item in data)
        
            ProductItemsByCategory.Add(item);
        
        TotalProductItems = ProductItemsByCategory.Count;
    
    

2.CategoryView.cs

 CategoryViewModel cvm;

    public CategoryView(Category category )
    
        InitializeComponent();
        cvm = new CategoryViewModel(category);
        this.BindingContext=cvm
       
        

           ;
    
    protected override void OnAppearing()
    
        base.OnAppearing();
        var bindingContext = BindingContext as CategoryViewModel;
        if (bindingContext != null)  
            
    

    async void ImageButton_Clicked(object sender, EventArgs e)
    
        await Navigation.PopModalAsync();



    

    async void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        var selectedProduct = e.CurrentSelection.FirstOrDefault() as ProductItem;
        if (selectedProduct == null)
            return;
        await Navigation.PushModalAsync(new ProductsDetailsView(selectedProduct));
        ((CollectionView)sender).SelectedItem = null;

    

3.BaseViewModel.cs

public  class BaseViewModel: INotifyPropertyChanged

  
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string name = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

  

【问题讨论】:

完全不清楚您要解决什么问题。您似乎遇到了绑定问题,但您尚未发布任何 XAML 来展示您尝试使用哪些绑定。 不需要“OnAppearing”,发布您的 xaml 代码。 【参考方案1】:

要将代码移动到OnAppearing 方法中,您可以创建一个Category 变量以在类构造函数中分配值,并在OnAppearing 方法中使用它。


Category _category ;
CategoryViewModel cvm get;set;

public CategoryView(Category category )

    InitializeComponent();
    _category  = category;    


protected override void OnAppearing()

    base.OnAppearing();
    cvm = new CategoryViewModel(_category);
    this.BindingContext=cvm;

【讨论】:

以上是关于如何将 View 类中的代码片段移动到 OnAppearing() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将工具栏添加到android中的片段?

如何从一个片段移动到一个活动

使用导航控制器按下后退按钮后,如何防止先前的片段出现?

从片段类中的对话框添加项目到recyclerview。

如何将字符串数据从活动发送到片段?

ViewModel 类中未设置对象,控制直接从数据访问类移动到 View