2015-10-15 3 views
0

У меня возникла проблема со списком в нескольких моих приложениях Xamarin Forms. Одна из форм находится в пределах закладками настройки страницы, а другой представляет собой обычное содержимое страницы (различные приложения)Обновление ListView с Xamarin.Forms

У меня есть класс, как этот

public class SomeClass 
{ 
    public string StringOne {get;set;} 
    public string StringTwo {get;set;} 
    public int IntOne {get;set;} 
} 

В моей странице содержимого, я настроить ObservableCollection и добавить некоторые data in. Затем я расскажу о том, что SomeClass является моим ItemSource. Это корректно отображает ListView на всех моих устройствах.

Проблема заключается в том, что при изменении одного из свойств ничего в элементе управления ListView ничего не меняется (так что если у меня есть 3 объекта в Observable и удаляем один, список все равно говорит 3 - или если я изменяю свойство в своем второй объект, второй элемент в ListView тоже не изменяется).

Я также попытался решить проблему, используя стандартный список и реализовать INotifyChanged в классе. Опять же, ListView не изменяется при изменении списка.

Я знаю, что данные изменились, как если бы я внес изменения в объект, выйдите и вернитесь, данные изменились в пользовательском интерфейсе.

Я делаю что-то неправильно или это ошибка, которую мне нужно ввести в Bugzilla?

+0

ObservableCollection следует обновлять, когда элемент добавляется или удаляется, - но это не заставит обновления, если элемент изменен, если этот элемент не реализует INotifyPropertyChanged. – Jason

+0

Итак, для просмотра списка нужно использовать как наблюдаемое, так и inotifypropertychanged? – Nodoid

ответ

0

Он не изменится, если вы не свяжете его и не реализуете интерфейс INotifyPropertyChanged.

Пример кода:

public class ObservableProperty : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class SomeClass:ObservableProperty 
{ 
    string stringOne; 
    string stringTwo; 
    int intOne; 
    public string StringOne 
    { 
     get{return stringOne;} 
     set 
     { 
      stringOne = value; 
      OnPropertyChanged("StringOne"); 
     } 
    } 

    public string StringTwo 
    { 
     get{ return stringTwo;} 
     set 
     { 
      stringTwo = value; 
      OnPropertyChanged("StringTwo"); 
     } 
    } 

    public int IntOne 
    { 
     get{ return intOne;} 
     set 
     { 
      intOne = value; 
      OnPropertyChanged("IntOne"); 
     } 
    } 
} 

public class MainVM:ObservableProperty 
{ 
    ObservableCollection<SomeClass> items; 

    public ObservableCollection<SomeClass> items 
    { 
     get{return items;} 
     set 
     { 
      items = value; 
      OnPropertyChanged("Items"); 
     } 
    } 

    public MainVM() 
    { 
     Items = new ObservableCollection<SomeClass>(); 

     Items.Add(new SomeClass(){StringOne = "123", StringTwo = "test", IntOne =12}); 
    } 

    public void CallMeForChangingProperty() 
    { 
     SomeClass item = Items[0]; 
     item.StringOne = "Test1"; 
    } 
} 


public class MainView 
{ 
    public MainView() 
    { 
     this.BindingContext= new MainVM() 
    } 
} 


< ListView ItemsSource="{Binding Items}" RowHeight="120"> 
< ListView.ItemTemplate> 
    < DataTemplate> 
    < ViewCell> 
     < ViewCell.View> 
     < StackLayout> 
      < Label Text= "StringOne" /> 
      < Label Text= "StringTwo" /> 
      < Label Text= "IntOne" /> 
     </ StackLayout> 
     </ ViewCell.View> 
    </ ViewCell> 
    </ DataTemplate> 
</ ListView.ItemTemplate> 
</ ListView> 
+0

Это в значительной степени то, что у меня уже есть, и я не вижу никаких изменений в пользовательском интерфейсе :( – Nodoid