手动引发属性更改以刷新可观察列表

时间:2018-08-17 08:30:25

标签: xamarin xamarin.forms xamarin.android

    private static ObservableCollection<Contact> _contacts;
    public ObservableCollection<Contact> Contacts
    {
        get { return _contacts; }
        set
        {
            _contacts = value;
            OnPropertyChanged("Contacts");
        }
    }

此可观察对象传递给另一个实现基本操作的视图模型。

    public async void OnSave()
    {
        Contacts.Add(Contact);
        Contacts = Utility.ArrangeContacts(Contacts);

         await Navigation.PopAsync();            
    }

我可以看到新联系人已添加到列表中,但是该列表仍未正确排列。我是否需要手动触发OnProperty更改以刷新“可观察”列表?

2 个答案:

答案 0 :(得分:1)

我不确定您要做什么。但是从我收集的代码中,您可以在其他地方更新列表。

据我所知,您将Contacts引用重置为新的ObservableList。这会破坏您的数据绑定,从而可能导致UI不会更新。

检索新列表,清除当前的ObservableCollection并重新填充它。或者,再次设置您的DataBinding属性,但这将导致重新评估所有绑定。

答案 1 :(得分:0)

来自我的自定义public class NiftyObservableCollection<T> : ObservableRangeCollection<T>

  //-----------------------------------------------------------------------------------------------------------
    public void ReportItemChange(T item)
    //-----------------------------------------------------------------------------------------------------------
    {
        NotifyCollectionChangedEventArgs args =
            new NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Replace,
                item,
                item,
                IndexOf(item));
        OnCollectionChanged(args);
    }

    //---------------------------------------------------------------------------------------------------------
    public void RefreshRange(int index, IEnumerable<T> collection)
    //---------------------------------------------------------------------------------------------------------
    {
        CheckReentrancy();
        var changedItems = collection is List<T> ? (List<T>)collection : new List<T>(collection);

        for (var currentIndex = index; currentIndex < changedItems.Count+index; currentIndex++ )
        {
            try
            {
                var i = changedItems[currentIndex];
                Items.RemoveAt(currentIndex); //remove
                Items.Insert(currentIndex, i); //insert new 
            }
            catch
            {
                break;
            }
        }

        // OnPropertyChanged(new PropertyChangedEventArgs("Count"));
        OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, changedItems, changedItems, index));
    }