Проблема с вашим кодом (я думаю) заключается в том, что новый DynamicModule
не создается каждый раз, когда вы создаете новую ячейку «ToDo».Таким образом, нигде не может быть сохранено состояние каждого Checkbox
.
Самое простое решение, которое я мог бы придумать для сохранения состояния Checkbox
для каждой ячейки "ToDo", - это перезаписать CellDingbat
при первом включении Checkbox
.(Другие варианты, с которыми я играл, использовали TaggingRules
, переключение между стилями «ToDo» и «ToDone» и т. Д.) *
Однако даже обычный Checkbox
в CellDingbat
не сохраняетего состояние - попробуйте выполнить следующее, затем циклически выводите через цикл Show Expression .
CellPrint[Cell["test", "Text", CellDingbat -> ToBoxes[Checkbox[]]]]
Чтобы обойти это, я использовал Checkbox
с определенным аргументом True
илиFalse
завернут в кнопку, которая меняет состояние.Это глупо и неэффективно, но работает!
Итак, мой код для стиля ячейки
Cell[StyleData["ToDo", StyleDefinitions -> StyleData["Item"]],
CellDingbat -> ButtonBox[CheckboxBox[False],
ButtonFunction :> (SelectionMove[ButtonNotebook[], All, ButtonCell];
With[{$CellContext`new = ReplaceAll[
Options[NotebookSelection[ButtonNotebook[]], CellDingbat],
CheckboxBox[Pattern[$CellContext`x, Alternatives[True, False]]] :> CheckboxBox[Not[$CellContext`x]]]},
SetOptions[NotebookSelection[ButtonNotebook[]], $CellContext`new]];
SelectionMove[ButtonNotebook[], After, CellContents]),
Appearance -> None, Method -> "Preemptive", Evaluator -> Automatic]]

Я не доволен этим решением, но это лучшее, что я придумал.Улучшение будет заключаться в перемещении кода функции кнопки из ячейки, чтобы он не повторялся для каждой проверенной ячейки задачи.Кроме того, чтобы он работал без ReplaceAll
, чтобы ядро не требовалось и функцию можно было запустить, используя только внешний интерфейс.