可观察集合更改为多个集合

本文关键字:集合 观察 | 更新日期: 2023-09-27 18:03:30

我在视图模型中有一个可观察集合Display collection。在视图中,它被绑定到带有自定义视图单元格的列表的itemsource。

ViewModel:

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

<listview ItemsSource="{Binding DisplayCollection}">

View.xaml.cs

View()
{
InitializeComponent();
ViewModel vm = new ViewMode();
this.BindingContext= vm;
}

On button click, UI没有改变,尽管displaycollection改变。

可观察集合更改为多个集合

我认为你的类应该实现INotifyPropertyChanged接口,并有一个函数,如:

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

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

OnPropertyChanged("nameOfTheCollection");

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

你需要实现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));