Обновление формы Xamarin listView itemSource
Ok у меня есть ListView
объект, который имеет List<Filiale>
as ItemSource
и я хотел бы обновить ItemSource
всякий раз, когда список объектов меняется. ListView имеет персонализированный ItemTemplate
Ибо теперь я сделал вот что:--9-->
public NearMe ()
{
list=jM.ReadData ();
listView.ItemsSource = list;
listView.ItemTemplate = new DataTemplate(typeof(FilialeCell));
searchBar = new SearchBar {
Placeholder="Search"
};
searchBar.TextChanged += (sender, e) => {
TextChanged(searchBar.Text);
};
var stack = new StackLayout { Spacing = 0 };
stack.Children.Add (searchBar);
stack.Children.Add (listView);
Content = stack;
}
public void TextChanged(String text){
//DOSOMETHING
list=newList;
}
как вы можете видеть в методе TextChanged, я назначаю новый список предыдущему, но в представлении нет изменений.
В ViewCell
что я создал, я назначаю текстовое поле меток с SetBinding
4 ответов
вы можете установить ItemsSource ListView в null, а затем снова установить его, что делает перезагрузку таблицы. http://forums.xamarin.com/discussion/18868/tableview-reloaddata-equivalent-for-listview
Ok вот как я решил проблему, прежде всего я создал "обертку", которая реализует INotifyPropertyChanged
для списка, который я принимал как ItemSource, как это:
public class Wrapper : INotifyPropertyChanged
{
List<Filiale> list;
JsonManager jM = new JsonManager ();//retrieve the list
public event PropertyChangedEventHandler PropertyChanged;
public NearMeViewModel ()
{
list = (jM.ReadData ()).OrderBy (x => x.distanza).ToList();//initialize the list
}
public List<Filiale> List{ //Property that will be used to get and set the item
get{ return list; }
set{
list = value;
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs("List"));// Throw!!
}
}
}
public void Reinitialize(){ // mymethod
List = (jM.ReadData ()).OrderBy (x => x.distanza).ToList();
}
затем в классе NearMe:
Wrapper nearMeVM = new Wrapper();
public NearMe ()
{
Binding myBinding = new Binding("List");
myBinding.Source = nearMeVM;
myBinding.Path ="List";
myBinding.Mode = BindingMode.TwoWay;
listView.SetBinding (ListView.ItemsSourceProperty, myBinding);
listView.ItemTemplate = new DataTemplate(typeof(FilialeCell));
searchBar = new SearchBar {
Placeholder="Search"
};
searchBar.TextChanged += (sender, e) => {
TextChanged(searchBar.Text);
};
var stack = new StackLayout { Spacing = 0 };
stack.Children.Add (searchBar);
stack.Children.Add (listView);
Content = stack;
}
public void TextChanged(String text){
if (!String.IsNullOrEmpty (text)) {
text = text [0].ToString ().ToUpper () + text.Substring (1);
var filterSedi = nearMeVM.List.Where (filiale => filiale.nome.Contains (text));
var newList = filterSedi.ToList ();
nearMeVM.List = newList.OrderBy (x => x.distanza).ToList ();
} else {
nearMeVM.Reinitialize ();
}
вы можете определить базовую модель представления и наследовать ее от INotifyPropertyChanged
public abstract class BaseViewModel : INotifyPropertyChanged
{
protected bool ChangeAndNotify<T>(ref T property, T value, [CallerMemberName] string propertyName = "")
{
if (!EqualityComparer<T>.Default.Equals(property, value))
{
property = value;
NotifyPropertyChanged(propertyName);
return true;
}
return false;
}
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
тогда в вашей viewmodel (Ex. JM) будет наследовать от BaseViewModel
и может создать ObservableCollection<YOURLISTCLASS>
список
также ваши поля в ViewModel (Ex. JM) должен реализовываться следующим образом:
public const string FirstNamePropertyName = "FirstName";
private string firstName = string.Empty;
public string FirstName
{
get { return firstName; }
set { this.ChangeAndNotify(ref this.firstName, value, FirstNamePropertyName); }
}
надеюсь, что это помогает.
изменить список на ObservableCollection и реализовать INotifyPropertyChanged, чтобы изменения отражались в вашем ListView.