关于可观察的集合,我有一个最奇怪的问题。我为集合设置了一些虚拟数据,并按预期将其加载到内容页面上,但是,当我尝试从数据上下文中获取数据时,该数据始终为空。
我调试了ViewModel中的代码,可以看到该集合为null。它显然不是null,因为我在表格上进行了填充。
这里缺少什么!
private ObservableCollection<Company> _CompanyCollection;
public ObservableCollection<Company> CompanyCollection
{
get { return _CompanyCollection; }
set
{
if (value != null)
{
_CompanyCollection = value;
OnPropertyChanged();
}
}
}
加载数据
public void LoadTestCompanies()
{
CompanyCollection = new ObservableCollection<Company>()
{
new Company() { Name="The Suit Lounge"},
new Company() { Name="The Suit Lounge"},
new Company() { Name="The Suit Lounge"}
};
}
从page.cs中的事件调用Viewmodel
CompaniesVM viewModel = (CompaniesVM)BindingContext;
var results = viewModel.CompanyCollection.Where(x => x.Name.ToLower().Contains(searchBar.Text.ToLower()));
这是背后的代码
public Companies ()
{
InitializeComponent ();
BindingContext = new CompaniesVM(this.Navigation);
}
ViewModel调用loatTestCompanies
public CompaniesVM(INavigation navigation)
{
// Navigation
Navigation = navigation;
LoadTestCompanies();
}
我尝试了许多初始化集合并使用.Add(object>的方法,但似乎没有任何效果。
任何想法都很棒。
谢谢
答案 0 :(得分:1)
两个建议可以解决您的问题:
在引用集合时使用自声明的只读属性:
from jinja2 import Template, Environment, meta
env = Environment()
ast = env.parse(code_string)
for var in meta.find_undeclared_variables(ast):
print(var) # <-----
template = Template(code_string)
template.render( # ... args
此更改将迫使您直接在构造函数中创建public ObservableCollection<Company> CompanyCollection { get; }
的实例:
CompanyCollection
然后...:
public CompaniesVM(INavigation navigation)
{
Navigation = navigation;
CompanyCollection = new ObservableCollection<Company>();
LoadTestCompanies();
}
我认为,更改绑定属性的引用本身意味着在public void LoadTestCompanies()
{
CompanyCollection.AddRange(new[]
{
new Company() { Name="The Suit Lounge"},
new Company() { Name="The Suit Lounge"},
new Company() { Name="The Suit Lounge"}
});
}
中使用一个对象实例,在ViewModel
中使用另一个实例。因此,视图“停止”监听该属性的VM更改。
我从未深入过View
的{{1}}实现,但是我想他们在绑定集合时会观察项目(在某些情况下会观察集合实例的属性)通知。
有了这些更改,我想您的代码应该可以正常工作。
希望有帮助。