Добавление типа A к типу B (элементы ObservableCollection)

У меня есть две 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 (например, обновить позиции индекса элементов в списке), а затем добавить этот обновленный элемент в другую коллекцию.

Например. Если бы я изменил индекс ItemXYZ в ProjectFileList, чтобы перейти в верхнюю часть списка, я бы хотел добавить этот ItemXYZ в WorkingFileList, но я не думаю, что смогу, потому что это два разных объекта. Мне нужно будет проверить, есть ли какие-то элементы в одном списке, и если их нет, то делать что угодно и т.д., но я не могу, потому что это разные объекты. Что мне нужно сделать, чтобы добавить элементы в другую коллекцию ObservableCollection?

Изменить

Я пробовал использовать один и тот же класс (WorkingFileItem) для обеих коллекций. Затем приступил к проверке индекса определенного элемента в WorkingFileList, но безуспешно. Код был:

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

Приведенный выше код возвращает -1, даже если элемент существует в WorkingFileList.


person Zer0    schedule 31.10.2015    source источник
comment
Почему у вас есть два класса (модели) с одинаковыми свойствами, но разными именами? Просто используйте один класс для представления объектов в двух коллекциях. Вы избежите проблемы с разными объектами, если захотите добавить элемент одного типа в коллекцию других типов.   -  person marcinax    schedule 31.10.2015
comment
@marcinax Я использую два разных шаблона ListboxItem, один с одинаковыми текстовыми блоками и изображением, другой без изображения.   -  person Zer0    schedule 31.10.2015
comment
@ F4z еще - где проблема с одним классом? нет смысла создавать два совершенно одинаковых класса - дублирование кода   -  person MajkeloDev    schedule 31.10.2015
comment
@MajkeloDev Я попробую внести изменения и посмотрю, как пойдет.   -  person Zer0    schedule 31.10.2015
comment
Поэтому я до сих пор не вижу смысла использовать два разных класса с одинаковыми свойствами. Теперь используйте один класс, но если вы хотите добавить какие-либо свойства к одной из моделей в будущем, вы можете использовать наследование.   -  person marcinax    schedule 31.10.2015
comment
@marcinax Я пытаюсь сделать int oldIndex = WorkingFileList.IndexOf ((WorkingFileItem) lblProjectFiles.SelectedItem); чтобы получить индекс выбранного объекта, но возвращает -1. Что может быть причиной? Я использую WorkingFileItem для обеих коллекций   -  person Zer0    schedule 31.10.2015
comment
Где вы пытаетесь получить SelectedItem? Вы уверены, что это не ноль? Вы подписались на событие SelectionChanged?   -  person marcinax    schedule 31.10.2015
comment
@marcinax Это не null, Нет, он не подписан на SelectionChanged, а на MouseDoubleClick, однако я получаю тот же результат, когда меняю его на SelectionChanged   -  person Zer0    schedule 31.10.2015


Ответы (1)


Мне кажется, что у вас есть два разных набора похожих (но не одинаковых) объектов, поэтому ваш код WorkingFileItem item = (WorkingFileItem)lbProjectsFiles.SelectedItem; Int index = WorkingFileList.IndexOf (item);

не работает. Самый простой способ разрешить эту ситуацию - переопределить Equals() метод WorkingFileItem:

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

Но вам обязательно нужно пересмотреть свою архитектуру.

person Alex Skiba    schedule 31.10.2015