Как редактировать элементы ListBox через IEditableCollectionView - PullRequest
0 голосов
/ 31 мая 2019

У меня есть 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 и иметь хотя бы один конструктор без параметров

1 Ответ

0 голосов
/ 31 мая 2019

Как использовать IEditableCollectionView для редактирования одного строкового элемента ItemsSource?

Вы не можете редактировать System.String, поскольку он неизменен, то есть его нельзя изменить после его создания.

Почему .NET String является неизменяемой?

Если вы используете изменяемую оболочку со свойством string, вы действительно можете изменить оболочку, но вы не можете предполагать, что каждый тип T, возвращаемый перечислителем, является изменяемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...