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
- 工作文件列表
- 项目文件列表
- 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我将尝试这些更改,看看它是如何进行的。因此,我仍然不认为有理由使用两个具有相同属性的不同类。现在,使用一个类,但如果您希望将来向其中一个模型添加任何属性,则可以使用继承。