可观察集合更改为多个集合
本文关键字:集合 观察 | 更新日期: 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));