Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Привязка TwoWay к List<int>

#c_sharp #wpf #xaml #binding


List Items { get; set; } = new List() { 1, 2, 3, 4, 5 };





   
       
          
       
   



Вопрос: Как сделать так,чтобы значения можно было изменять в обе стороны,а не только
при начальной привязке при загрузке формы.

p.s. не оборачивая int в класс.
    


Ответы

Ответ 1



Напрямую привязаться не удастся, но это не сильно большая проблема. Заводить обёртку вокруг int на уровне VM неправильно, поэтому применим конвертер. class EditableValueTypeConverter : IValueConverter where T : struct { class ItemWrapper { public ItemWrapper(IList container, int index) => (this.container, this.index) = (container, index); IList container; int index; public T Value { get => container[index]; set => container[index] = value; } } public object Convert(object value, Type targetType, object p, CultureInfo ci) { var list = (IList)value; return Enumerable.Range(0, list.Count) .Select(idx => new ItemWrapper(list, idx)) .ToList(); // или просто list.Select((t, idx) => new ItemWrapper(list, idx)).ToList() } public object ConvertBack(object value, Type targetType, object p, CultureInfo ci) => throw new NotSupportedException(); } class IntListConverter : EditableValueTypeConverter { } Теперь наш XAML выглядит как-то так: Результат:

Комментариев нет:

Отправить комментарий