我有两个ObservableCollections:
要填充这两个集合,我有两个继承INotifyPropertyChanged的类:
就属性而言,它们都具有完全相同的字符串和名称:
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
中答案 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();
}
但你必须检查你的架构。