将类型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 中

将类型A添加到类型B(ObservableCollection项)

在我看来,您有两组不同的相似(但不相同)对象,这就是为什么您的代码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();
}

但你肯定要复习一下你的体系结构。