XAML ObservableCollection显示在UI中,但在Xamarin中速度缓慢

vs91vp4v  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(159)

有一个页面,用户在其中选择参数以显示适当的收集,然后点击按钮跳转到下一个页面(收集),在那里它应该显示。

用户选择页XAML:

<ContentPage.BindingContext><xyz:UserSelectionViewModel</ContentPage.BindingContext>
...
<Button x:Name="Start" Command="{Binding LoadData}" Pressed="StartClick"/>

用户选择页面C#:

private async void ButtonClick(object sender, EventArgs e)
{
   var vm = (CollViewModel)BindingContext;

   vm.Hard = HardButtonSelected == Hard;
   ...
   vm.Subject = vm.Subject.ToLower();
}

用户选择视图模型:

public class UserSelectionViewModel : BaseViewModel
{
   public UserSelectionViewModel()
   {
            _dataStore = DependencyService.Get<IDataStore>();
            _pageService = DependencyService.Get<IPageService>();

            LoadData= new AsyncAwaitBestPractices.MVVM.AsyncCommand(FilterData);

            FilteredData = new ObservableRangeCollection<Items>();
   }
   public async Task FilterData()
   {
            FilteredData.Clear();
            var filtereddata = await _dataStore.SearchData(Hard, Subject).ConfigureAwait(false);
            FilteredData.AddRange(filtereddata);
            OnPropertyChanged("FilteredData");

            Debug.WriteLine(FilteredData.Count());
            await Device.InvokeOnMainThreadAsync(() => _pageService.PushAsync(new Coll(FilteredData)));
   }  
}

科尔XAML:

<ContentPage.BindingContext><xyz:CollViewModel</ContentPage.BindingContext>
...
<CarouselView ItemsSource="{Binding Source={RelativeSource AncestorType={x:Type z:Coll}}, Path=InheritedData}" ItemTemplate="{StaticResource CollTemplateSelector}">
...

科尔编号:

public partial class Coll : ContentPage
{
     public ObservableRangeCollection<Feladatok> InheritedData { get; set; }

     public Coll(ObservableRangeCollection<Feladatok> x)
     {
            InitializeComponent();

            InheritedData = x;
            OnPropertyChanged(nameof(InheritedData));
     }
}

收集视图模型:

public class CollViewModel : UserSelectionViewModel { ... }

基本视图模型:

private ObservableRangeCollection<Feladatok> inheriteddata;

public ObservableRangeCollection<Feladatok> InheritedData
{
      get
      {
          return inheriteddata;
      }
      set
      {
          if (value != inheriteddata)
          {
              inheriteddata = value;
              PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("InheritedData"));
          }
      }
}

在Jason的建议帮助下,我成功地做到了这一点。我唯一担心的是:这会不会减慢我加载可观察集合两次的页面速度?这是一个很好的实践吗?

esyap4oy

esyap4oy1#

最后将BindingContext设置为VM并从那里绑定。我仍然觉得它可以更有效地完成,或者可能这就是它的完成方式。ViewModel对我来说仍然是新的,我觉得它的代码更多,速度更慢。但我将关闭它,因为它现在正在工作。

相关问题