Формы Xamarin - наблюдаемая коллекция MVVM всегда нулевая - PullRequest
0 голосов
/ 10 сентября 2018

У меня самая странная проблема с наблюдаемой коллекцией. Я установил в мою коллекцию некоторые фиктивные данные, и она загружается на страницу содержимого, как и ожидалось, однако, когда я пытаюсь получить данные из контекста данных, они всегда равны нулю.

Я отладил код в ViewModel и вижу коллекцию как нулевую. Его явно не ноль, потому что я заполняю форму.

Есть ли что-то, что мне здесь не хватает!

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"}
  };
}

Вызов Viewmodel из события в page.cs

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 голосов
/ 11 сентября 2018

Два совета, которые могут решить вашу проблему:

1

Используйте самопровозглашенное свойство только для чтения при обращении к коллекциям:

public ObservableCollection<Company> CompanyCollection { get; }

2

Это изменение заставит вас создать экземпляр 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 используется экземпляр объекта, а в View - другой. Таким образом, представление «останавливается» для прослушивания изменений ВМ для этого свойства.

Я никогда не углублялся в реализации ItemsSource s Views, но я полагаю, что они как бы замечают элементы при связывании коллекций - или в некоторых случаях свойства экземпляра коллекции - при получении уведомления об изменениях.

С этими изменениями, я думаю, ваш код должен работать нормально.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...