如何将 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() 方法?的主要内容,如果未能解决你的问题,请参考以下文章