2015-10-31 88 views
1

我有兩個ObservableCollections:添加A型到B型(的ObservableCollection項目)

  • 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中的項目(例如,更新列表框中項目的索引位置),然後將該更新的項目添加到其他集合。

E.g.如果我在ProjectFileList中更改了ItemXYZ的索引以進入列表頂部,我想將該ItemXYZ添加到WorkingFileList中,但我不認爲我可以,因爲它們都是兩個不同的對象。我將需要檢查一些項目是否已經在一個列表中,如果他們不是,那麼做什麼等,但我不能,因爲它們都是不同的對象。我需要做什麼才能將項目添加到其他ObservableCollection中?

編輯

我一直使用同一類(WorkingFileItem)兩個集合嘗試。然後繼續檢查WorkingFileList中特定項目的索引,但沒有運氣。代碼爲:

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

以上回報的代碼爲-1,即使在WorkingFileList存在的項目

+1

爲什麼你有兩個具有相同屬性但名稱不同的類(模型)?只需使用一個類來表示兩個集合中的對象。當您想要將一種類型的項目添加到其他類型的集合時,您將避免使用不同對象的問題。 – marcinax

+0

@marcinax我正在使用兩個不同的ListboxItem模板,一個具有相同的文本塊和圖像,另一個沒有圖像。 – Zer0

+0

@ F4z仍然 - 有一個班的問題在哪裏?沒有意義創建兩個完全相同的類 - 代碼複製 – MajkeloDev

回答

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(); 
} 

但是你一定要檢查你的架構。

相關問題