Предлагаемые операции действительно могут быть реализованы как reduce
(он же foldr
):
(+ 1 (* 9 (+ 2 (* 9 (+ 3 (* 9 13))))))
=> 9739
(reduce (lambda (e acc) (+ e (* 9 acc)))
13
'(1 2 3))
=> 9739
Что касается констант, то 13
используется только один раз в самое внутреннее выражение, так что оно подходит для использования в качестве начального значения. 9
используется для умножения накопленного значения. Список ввода используется справа налево, когда рекурсия начинает раскручиваться, и в этот момент мы добавляем текущий элемент к накопленному результату.
Вы не можете сделать это таким образом.
Чтобы добиться такого трюка, вам нужно, чтобы ваши элементы были «классами-держателями», предоставляющими свойство, с которым вы можете связать свое текстовое поле.
Чтобы понять это, представьте следующую псевдопоследовательность вызовов:
class ListBox
{
Bind(Items)
{
foreach(var item in Items)
{
DataTemplate Template = LoadTemplateForItem(item.GetType()); // this is where your template get loaded
Template.Bind(item); //this is where your template gets bound
}
}
}
Ваш шаблон ( DataTemplate со списком) загружается и элемент (который, как я полагаю, является строкой) передается внутрь. На данный момент он знает только строку и не может влиять на что-либо вверх. Двусторонняя привязка не может влиять на коллекцию, поскольку шаблон не знает, в каком контексте он используется, поэтому он не может обратиться к исходной коллекции и изменить ее содержимое. В этом отношении это то же самое для TextBox. Если ему не даны conainer и имя свойства, ему некуда «сохранить» изменения. Это в основном то же самое, что и передача строки в вызов функции. Функция не может изменить, какая строка была передана (игнорируя такие хитрости, как передача аргумента по ссылке).
Чтобы вернуться к вашему случаю, вам нужно создать коллекцию объектов, которые предоставляют свойство, содержащее значение, которое должно быть Отредактировано:
public class MyDataItem
{
string Data { get; set;}
}
Затем вы можете связать свой ListBox с коллекцией этих элементов и изменить вашу таблицу данных:
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Name="EditableText" Text="{Binding Data, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
Привязать к свойству модели - то есть свойству объекта данных - а не к свойству вида, например Содержание. Например:
// model class
public class Widget : INotifyPropertyChanged
{
public string Description { ... }
}
<!-- view -->
<DataTemplate>
<TextBox Text="{Binding Description}" />
</DataTemplate>
Обратите внимание, что это не будет работать, если ваш ItemsSource имеет ObservableCollection (потому что нет свойства для привязки).