将类型A添加到类型B(ObservableCollection项)
本文关键字:类型 ObservableCollection 添加 | 更新日期: 2023-09-27 18:19:57
我有两个可观测集合:
- 工作文件列表
- 项目文件列表
为了填充这两个集合,我有两个类继承INotifyPropertyChanged:
- WorkingFileItem(添加到WorkingFileList集合)
- ProjectFileItem(添加到ProjectFileList集合)
就属性而言,它们都有完全相同的字符串和名称:
public class WorkingFileItem : INotifyPropertyChanged
{
string name;
public string Name
{
get { return name; }
set
{
if (name != value)
name = value; OnPropertyChanged("Name");
}
}
string filepath;
public string FilePath
{
get { return filepath; }
set
{
if (filepath != value)
filepath = value; OnPropertyChanged("FilePath");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public class ProjectFileItem : INotifyPropertyChanged
{
string name;
public string Name
{
get { return name; }
set
{
if (name != value)
name = value; OnPropertyChanged("Name");
}
}
string filepath;
public string FilePath
{
get { return filepath; }
set
{
if (filepath != value)
filepath = value; OnPropertyChanged("FilePath");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
我用绑定了两个列表框
ObservableCollection<WorkingFileItem> WorkingFileList = new ObservableCollection<WorkingFileItem>();
LB1.ItemsSource = WorkingFileList
ObservableCollection<ProjectFileItem> ProjectFileList = new ObservableCollection<ProjectFileItem>();
LB2.ItemsSource = ProjectFileList
问题:
我可能想更新ProjectFileList中的项(例如,更新列表框中项的索引位置),然后将更新后的项添加到其他集合。
例如,如果我将ProjectFileList中的ItemXYZ的索引更改为列表的顶部,我会想将该ItemXYZ添加到WorkingFileList中,但我认为我做不到,因为它们都是两个不同的对象。我需要检查一些项目是否已经在一个列表中,如果没有,则执行其他操作等。但我不能,因为它们都是不同的对象。我该怎么做才能将这些项目添加到其他ObservableCollection?
编辑
我已经尝试将同一个类(WorkingFileItem)用于两个集合。然后继续检查WorkingFileList中特定项目的索引,但没有成功。代码为:
WorkingFileItem item = (WorkingFileItem)lbProjectsFiles.SelectedItem;
Int index = WorkingFileList.IndexOf (item);
上面的代码返回-1,即使该项存在于WorkingFileList 中
在我看来,您有两组不同的相似(但不相同)对象,这就是为什么您的代码WorkingFileItem item = (WorkingFileItem)lbProjectsFiles.SelectedItem;
Int index = WorkingFileList.IndexOf (item);
不起作用。解决这种情况的最简单方法是覆盖WorkingFileItem:的Equals()
方法
public override bool Equals(System.Object obj)
{
if (obj == null)
{
return false;
}
WorkingFileItem item = obj as WorkingFileItem;
return Equals(item);
}
public bool Equals(WorkingFileItem item)
{
if (item == null)
{
return false;
}
return (Name == item.Name) && (FilePath == item.FilePath);
}
public override int GetHashCode()
{
return Name.GetHashCode() ^ FilePath.GetHashCode();
}
但你肯定要复习一下你的体系结构。