我有一个DataGrid
绑定到List<T>
。 下面是我的课程。List<FSCLevel>
与我的主要DataGrid
中的RowDetails
绑定。 我添加了一个过滤器控件供用户过滤CUSTOMER_CODE
。
public class CUSTCARDLevel: INotifyPropertyChanged
{
#region Members
private string _cUSTOMER_CODE;
private List<FSCLevel> _fSClist;
#endregion
#region Properties
public string CUSTOMER_CODE { get { return _cUSTOMER_CODE; } set { _cUSTOMER_CODE = value; OnPropertyChanged("CUSTOMER_CODE"); } }
public List<FSCLevel> FSCLIST { get { return _fSClist; } set {_fSClist = value; OnPropertyChanged("FSCLIST"); } }
#endregion
// INotifyPropertyChanged interface
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{ PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我现在需要在列表中应用一些过滤器,例如,DataGrid
它只显示CUSTOMER_CODE
是"CUST1"。
所以问题来了,我必须使用ObservableCollection
来过滤吗? 有没有办法让我只使用带有INotifyPropertyChanged
接口的类? 如果是这样,在List<T>
内处理List<T1>
的最佳方法是什么? 假设我使用以下方法将列表转换为ObservableCollection<T>
:
ObservableCollection<CUSTCARDLevel> myObserveList = new ObservableCollection<CUSTCARDLevel>(myList);
里面的List<FSCLevel>
会怎样? 或者如何将CUSTCARDLevel中的List<FSCLevel>
投射到ObservableCollection中? 或者我需要做点什么来修复我的课程?
我想把它作为一个评论,但它超出了字符限制。我会直接说的。
好吧,这一切都与时间的需要有关。
我强烈建议不要频繁地使用
new ObservableCollection<object>(myList)
进行转换,因为它每次都会返回一个占用memory
的新实例。
现在,假设您有一个List<T>
,并且您想要反映在UI上的List<T>
项的任何更改,那么您应该只对List<T>
使用ObservableCollection
,而不是对属于Class T
的任何List
使用。
相反,如果您的UI每次修改class T
中的collection
时都需要更新,我建议您将其设为ObservableCollection
。
通常,在最常见的方式中,开发人员使用ExtensionMethods
将List<T>
转换为ObservableCollection<T>
在此处阅读更多相关信息
此外,它们使用XAML Converters
并将元素直接绑定到列表。
我的最后一个建议:如上所述,根据您的需求使用可观察的集合,但最重要的是,除非实际需要,否则不要对
Lists
进行操作。将服务中的data
提取到List
将其转换为ObservableCollection
一次,然后使用System.LINQ
从中筛选数据。