Обновление формы 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.