可观察的集合改变了多个集合

时间:2016-08-23 10:14:24

标签: c# xamarin xamarin.forms

我在视图模型中有一个可观察的集合显示集合。 在视图中,它绑定到具有自定义视图单元格的列表的项目源。

ViewModel:

start = "http://www\."
end = "\.com"

View.xaml

public ObservableCollection<StatisticsData>DisplayCollection { get; set; } = null;

private ObservableCollection<StatisticsData> Collection1 = null;

private ObservableCollection<StatisticsData>Collection2 = null;

void somefn(string btnname){

if(btnname.equals("1"))
DisplayCollection=Collection1;
}

else
{
DisplayCollection = Collection2;
}

View.xaml.cs

<listview ItemsSource="{Binding DisplayCollection}">

单击按钮,尽管显示收集更改,UI仍未更改。 请帮助我。

2 个答案:

答案 0 :(得分:0)

我认为你的类应该实现INotifyPropertyChanged接口,具有如下函数:

 public event PropertyChangedEventHandler PropertyChanged;
 private void OnPropertyChanged(string property)
 {
     if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(property));
 }

然后当集合发生变化时,你必须调用

OnPropertyChanged("nameOfTheCollection");

它可以在集合中或任何你想要的地方

答案 1 :(得分:0)

您需要实现INotifyPropertyChanged,否则XAML永远不会知道您的集合已更新。

如果你要使用MVVM,我建议你创建一个基本视图模型:

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool SetProperty<T>(ref T storage, T value,
                                    [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    internal bool ProcPropertyChanged<T>(ref T currentValue, T newValue, [CallerMemberName] string propertName = "")
    {
        return SetProperty(ref currentValue, newValue, propertName);
    }

    internal void ProcPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在您的所有视图模型类中扩展此基础:

public class ViewModel : ViewModelBase

然后,每当您更新要在XAML中看到的内容时,请使用基类中的一个函数:

bool myBool
public bool MyBool
{
get { return myBool; }
set { SetProperty(ref myBool, value); }
}

对于您的情况,每当使用此基本视图模型时集合发生更改,您只需致电:OnPropertyChanged(nameof(DisplayCollection));