2015-10-15 41 views
0

我在一些Xamarin Forms應用程序中遇到了列表視圖問題。一種形式是標籤頁中設置內,另一種是正常的內容頁面(不同的應用程序)用Xamarin.Forms更新ListView

我有這樣

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

在我的內容頁面類,我成立了一個ObservableCollection,並添加一些數據。然後我告訴列表SomeClass是我的ItemSource。這會在我的所有設備上正確生成ListView。

問題是,當我更改其中一個屬性時,ListView上的任何內容都不會改變(所以如果說我在Observable中有3個對象並刪除它,列表仍然會顯示3 - 或者如果我更改了屬性第二個對象,ListView上的第二項不會更改)。

我也嘗試通過使用標準列表並在類中實現INotifyChanged來解決問題。同樣,當列表更改時,ListView不會改變。

我知道數據已經改變,好像我改變了對象,出來又回來了,UI中的數據已經改變了。

我做錯了什麼,或者這是我需要投入Bugzilla的錯誤嗎?

+0

一個ObservableCollection應該更新,當一個項目被添加或刪除 - 但它不會強制進行更新,如果一個項目被修改,除非該項目實現INotifyPropertyChanged。 – Jason

+0

所以我需要observable和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

這幾乎是我已經和我沒有看到任何UI的變化:( – Nodoid