我在视图模型中有一个可观察的集合显示集合。 在视图中,它绑定到具有自定义视图单元格的列表的项目源。
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仍未更改。 请帮助我。
答案 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));