У меня есть ListBox
, который ItemsSource
связан с ViewModel's ObservableCollection
.
Сейчас я делаю кастомный котрол, который должен манипулировать ListBox
предметами.
Например, перемещать элементы вверх / вниз.
Я не могу работать с ItemsSource
, потому что хочу, чтобы этот элемент управления работал с различными типами данных, и я не знаю, что это будет за Type
.
Все, что я знаю о ItemsSource
типе - это будет IEnumerable
.
Поэтому я написал код, который использует IEditableCollectionView
для обмена значениями свойств соседних элементов.
Это прекрасно работает, если ItemsSource
является ObservableCollection
некоторого сложного типа - ObservableCollection<Customers>
.
private void ItemsSwapComplex(object originalSource, object originalDestination)
{
IEditableCollectionView items = ListBoxToManage.Items;
Type type = originalSource.GetType();
// Create clones of Source and Destination
// DOES NOT WORK WITH <string>
dynamic cloneSource = Activator.CreateInstance(type);
dynamic cloneDestination = Activator.CreateInstance(type);
// Copy property values from Original to Clone
PropertiesCopyComlex(originalSource, cloneSource);
PropertiesCopyComlex(originalDestination, cloneDestination);
// Copy new property values to the Source item
items.EditItem(originalSource);
object editSource = items.CurrentEditItem;
PropertiesCopyComlex(cloneDestination, editSource);
items.CommitEdit();
// Copy new property values to the Destination item
items.EditItem(originalDestination);
object editDestination = items.CurrentEditItem;
PropertiesCopyComlex(cloneSource, editDestination);
items.CommitEdit();
}
private void PropertiesCopyComlex(object originalSource, object originalDestination)
{
foreach (var v in originalSource.GetType().GetProperties())
{
v.SetValue(originalDestination, v.GetValue(originalSource));
}
}
Но если ItemsSource
является коллекцией простого типа, такой как ObservableCollection<string>
- он выдает исключение, что string
не имеет конструктора.
И я не понимаю, как использовать IEditableCollectionView
для редактирования простых строк ListBox
элементов.
Этот код никак не влияет на ItemsSource
:
IEditableCollectionView items = ListBoxToManage.Items;
items.EditItem(originalSource);
object editSource = items.CurrentEditItem;
editSource = "New string";
items.CommitEdit();
Как использовать IEditableCollectionView
для редактирования одного string
элемента ItemsSource
?
ОБНОВЛЕНИЕ: этот пост подразумевает, что моя задача невозможна. Нужно использовать обертку для строки. И для моей конкретной задачи - оболочка должна реализовывать INotifyPropertyChanged
и иметь хотя бы один конструктор без параметров