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

时间:2015-10-31 11:56:31

标签: c# wpf listbox observablecollection updating

我有两个ObservableCollections:

  • WorkingFileList
  • ProjectFileList

要填充这两个集合,我有两个继承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中的Item(例如更新列表框中项目的索引位置),然后将更新后的Item添加到其他集合中。

E.g。如果我在ProjectFileList中更改ItemXYZ的索引以转到列表的顶部,我想将ItemXYZ添加到WorkingFileList中,但我认为我不能,因为它们都是两个不同的对象。我将需要检查一些项目是否已经在一个列表中,如果它们不是那么做等等但我不能,因为它们都是不同的对象。将项目添加到其他ObservableCollection我需要做什么?

修改

我尝试为两个集合使用相同的类(WorkingFileItem)。然后继续检查WorkingFileList中特定项的索引,但没有运气。代码是:

WorkingFileItem item = (WorkingFileItem)lbProjectsFiles.SelectedItem;
Int index = WorkingFileList.IndexOf (item);

上面的代码返回-1,即使该项存在于WorkingFileList

1 个答案:

答案 0 :(得分:0)

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

但你必须检查你的架构。