c# - UI 未使用 xamarin 中的分组 observablecollection 更新
问题描述
我对 xamarin-forms 比较陌生,并且已经遇到这个问题好几天了。我已经阅读了很多信息,但我无法解决它。我有一个可观察的集合,它在 UpdateListContent () 的帮助下分组在列表视图中,我从另一个网站获取了这部分,它工作正常。问题是当我修改内容并返回到组所在的屏幕时,UI 没有更新,数据到达并被正确处理,但不可见。我读到您必须对 OC 实施 OnPropertyChanged 以便更新视图,我已经尝试过这种方式以及其他一千种方式,但我不能。当我将 OnPropertyChanged 提供给 OC 或尝试强制视图为空并再次分配数据时,我总是在以下位置收到相同的错误:
GroupedView.ItemsSource = "";
“你调用的对象是空的。”
使用 UpdateListContent () 这是我发现做我需要的唯一方法,但我需要更新 UI。我可能做错了什么,但我的想法已经结束,我找不到其他任何东西。
我真的很感激帮助。谢谢你。
VS2019 16.2.4
XF 4.1.0
代码背后
public partial class CandidatosView : ContentPage, INotifyPropertyChanged
{
private ObservableCollection<CandidatoGroup> allGroups { get; set; }
//private ObservableCollection<CandidatoGroup> _expandedGroups;
//public ObservableCollection<CandidatoGroup> expandedGroups
//{
// get { return _expandedGroups; }
// set
// {
// _expandedGroups = value;
// OnPropertyChanged("expandedGroups");
// }
//}
private ObservableCollection<CandidatoGroup> expandedGroups { get; set; }
public CandidatosView()
{ }
public CandidatosView(Guid IdOferta)
{
InitializeComponent();
BindingContext = new CandidatosViewModel(IdOferta);
}
protected override void OnAppearing()
{
base.OnAppearing();
allGroups = CandidatosViewModel.All;
allGroups.ForEach(x => x.Expanded = false);
UpdateListContent();
}
private void HeaderTapped(object sender, EventArgs args)
{
int selectedIndex = expandedGroups.IndexOf(
((CandidatoGroup)((Button)sender).CommandParameter));
allGroups[selectedIndex].Expanded = !allGroups[selectedIndex].Expanded;
UpdateListContent();
}
private void UpdateListContent()
{
MessagingCenter.Subscribe<GestionCandidatoViewModel>(this, "Expanded", sender =>
{
allGroups.ForEach(x => x.Expanded = false);
});
expandedGroups = new ObservableCollection<CandidatoGroup>();
foreach (CandidatoGroup group in allGroups)
{
CandidatoGroup newGroup = new CandidatoGroup(group.Title, group.ShortName, group.Expanded);
newGroup.CandidatosCount = group.Count;
if (group.Expanded)
{
foreach (Candidato candidato in group)
{
newGroup.Add(candidato);
}
}
expandedGroups.Add(newGroup);
}
try
{
GroupedView.ItemsSource = "";
GroupedView.ItemsSource = expandedGroups;
}
catch (Exception ex)
{
Application.Current.MainPage.DisplayAlert("Error", ex.Message, "Ok");
}
}
}
CandidatoGroup 类
public class CandidatoGroup : ObservableCollection<Candidato>, INotifyPropertyChanged
{
private bool _expanded;
public string Title { get; set; }
public string TitleWithItemCount
{
get { return string.Format("{0} ({1})", Title, CandidatosCount); }
}
public string ShortName { get; set; }
public bool Expanded
{
get { return _expanded; }
set
{
if (_expanded != value)
{
_expanded = value;
OnPropertyChanged("Expanded");
OnPropertyChanged("StateIcon");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string StateIcon
{
get { return Expanded ? "down" : "up"; }
}
public int CandidatosCount { get; set; }
public CandidatoGroup(string title, string shortName, bool expanded = true)
{
Title = title;
ShortName = shortName;
Expanded = expanded;
}
}
解决方案
错误就在这里
public CandidatosView(Guid IdOferta)
{
InitializeComponent();
BindingContext = new CandidatosViewModel(IdOferta);
}
它应该this
代替new CandidatosViewModel(IdOferta);
更正:
public CandidatosView(Guid IdOferta)
{
InitializeComponent();
BindingContext = this;
}
推荐阅读
- python - 为什么增加层数不能使我的网络更准确?
- time-complexity - 我需要帮助证明如果 f(n) = O(g(n)),则 log f(n) = O(log g(n)) 为 FALSE
- java - 使用 JDK 库计算 Sha256 数组
- kotlin - 将键值映射到 Kotlin 中的数据类
- mysql - 如果连接之一上没有值,mysql返回null
- postgresql - 使用 postgres row_number() 函数选择给定记录 id 的行号
- react-native - 添加 react-native-firebase/admob 时应用程序崩溃
- java - Spring Cloud Data Flow:是否可以在没有任何消息传递中间件(kafka/rabbit)或使用 db 而不是队列的情况下运行?
- ssl - 实施 LDAPS:我可以购买与保护 Web 域相同类型的 SSL 证书吗?
- string - 如何查看映射键是否包含某些字符串?