Как клонировать объект?

#wpf #visual-studio #.net-6.0

Вопрос:

Приложение WPF .Net 6.0 Visual Studio

 CategoryList_Copy.Items.Clear() Dim newNode As ItemCollection = CType(CategoryList.Items.Clone(), ItemCollection)  CategoryList_Copy.Items.Add(newNode)  

Как я могу заставить это работать? Я пытаюсь скопировать один элемент из дерева в другое дерево.

Для этого я использую пакет NuGet под названием AnyClone, но я думаю, что делаю что-то не так.

Я получаю эту ошибку:

 System.MissingMethodException: 'Constructor on type 'System.Windows.Controls.ItemCollection' not found.'  

Что я делаю не так?

Ответ №1:

Прежде всего, ошибка очень легко объяснима: у ItemCollection нет общедоступного конструктора с 0 параметрами. Очевидно, что AnyClone должен создать экземпляр элемента, который он хочет клонировать, что не поддерживается коллекцией элементов, по крайней мере, без указания параметров.

Однако это не должно иметь значения, вы просто используете неправильный подход к копированию своих данных.

ItemCollection — это представление, которое — из предоставленной привязки данных-используется в качестве слоя между вашими данными и вашим древовидным представлением, поэтому вы можете применять сортировку/фильтрацию/группировку без изменения данных. Если вы хотите скопировать данные из одного дерева в другое, не копируйте данные в коллекции элементов, скопируйте данные в источник элементов.

Кроме того, вы пытаетесь клонировать все элементы, а не только тот, который хотите скопировать. Даже если вы обойдете описанную выше ошибку: вы пытаетесь скопировать полное представление одного дерева, а затем добавить его в качестве элемента в другое дерево, чего вы не пытаетесь достичь.

Гораздо более чистым подходом было бы следующее:

TreeView должен быть ItemsSource : Привязать этот источник элементов к данным, которые вы хотите отобразить в своем представлении дерева. Убедитесь CategoryList_Copy , что у вас есть отдельная коллекция, привязанная к ее источнику элементов. При копировании данных просто скопируйте значение из источника элементов одного списка категорий в другой. Там вы сможете легко использовать метод клонирования АниКлона.