Xamarin表单-MVVM可观察的集合始终为null

时间:2018-09-09 23:01:27

标签: c# mvvm xamarin.forms

关于可观察的集合,我有一个最奇怪的问题。我为集合设置了一些虚拟数据,并按预期将其加载到内容页面上,但是,当我尝试从数据上下文中获取数据时,该数据始终为空。

我调试了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>的方法,但似乎没有任何效果。

任何想法都很棒。

谢谢

1 个答案:

答案 0 :(得分:1)

两个建议可以解决您的问题:

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

2

此更改将迫使您直接在构造函数中创建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}}实现,但是我想他们在绑定集合时会观察项目(在某些情况下会观察集合实例的属性)通知。

有了这些更改,我想您的代码应该可以正常工作。

希望有帮助。