C# 将类型A添加到类型B(可观察到的收集项目)

C# 将类型A添加到类型B(可观察到的收集项目),c#,wpf,listbox,observablecollection,updating,C#,Wpf,Listbox,Observablecollection,Updating,我有两个可观察到的集合: 工作文件列表 项目文件列表 要填充这两个集合,我有两个继承INotifyPropertyChanged的类: WorkingFileItem(添加到WorkingFileList集合) ProjectFileItem(添加到ProjectFileList集合) 就属性而言,它们都具有完全相同的字符串和名称: public class WorkingFileItem : INotifyPropertyChanged { string nam

我有两个可观察到的集合:

  • 工作文件列表
  • 项目文件列表
要填充这两个集合,我有两个继承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 

上面的代码返回-1,即使该项存在于WorkingFileList中,在我看来,您有两组不同的相似(但不相同)对象,这就是代码的原因
WorkingFileItem=(WorkingFileItem)lbProjectsFiles.SelectedItem;
Int index=WorkingFileList.IndexOf(项目)

它不起作用。解决这种情况的最简单方法是重写
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();
}

但您肯定必须检查您的体系结构。

在我看来,您有两组不同的相似(但不相同)对象,这就是您的代码的原因
WorkingFileItem=(WorkingFileItem)lbProjectsFiles.SelectedItem;
Int index=WorkingFileList.IndexOf(项目)

它不起作用。解决这种情况的最简单方法是重写
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();
}

但是您肯定必须检查您的体系结构。

为什么有两个属性相同但名称不同的类(模型)?只需使用一个类来表示两个集合中的对象。当您想将一种类型的项添加到另一种类型的集合中时,可以避免不同对象出现问题。@marcinax我使用的是两个不同的ListboxItem模板,一个具有相同的文本块和图像,另一个没有图像。@F4z仍然-有一个类哪里有问题?创建两个完全相同的类(代码)是没有意义的duplication@MajkeloDev我将尝试这些更改,看看它是如何进行的。因此,我仍然不认为有理由使用两个具有相同属性的不同类。现在,使用一个类,但如果将来要向其中一个模型添加任何属性,可以使用继承。为什么有两个属性相同但名称不同的类(模型)?只需使用一个类来表示两个集合中的对象。当您想将一种类型的项添加到另一种类型的集合中时,可以避免不同对象出现问题。@marcinax我使用的是两个不同的ListboxItem模板,一个具有相同的文本块和图像,另一个没有图像。@F4z仍然-有一个类哪里有问题?创建两个完全相同的类(代码)是没有意义的duplication@MajkeloDev我将尝试这些更改,看看它是如何进行的。因此,我仍然不认为有理由使用两个具有相同属性的不同类。现在,使用一个类,但如果您希望将来向其中一个模型添加任何属性,则可以使用继承。