Something like
publicoverrideIRenderableRender()=>UI.Build().Button("Add todo",AppStateManager.OnClick,ButtonStyle).ForEach(props.Value?.TodoItems??new(), todo =>UI.Text($"{todo.Text} ({(todo.Done?"done":"to do")}).",TextStyle)).Render();Where UI is a helper with extension methods:
publicstaticclassUI{publicstaticUIBuilderBuild()=>newUIBuilder();publicstaticUIBuilderForEach<T>(thisUIBuilderbuilder,IEnumerable<T>items,Func<T,IRenderable>render)=>builder.Add(items.Select(render));publicstaticUIBuilderButton(thisUIBuilderbuilder,stringtext,ActiononClick,WidgetStylestyle)=>builder.Add(WidgetNodeFactory.Button(text,onClick,style));publicstaticUIBuilderText(thisUIBuilderbuilder,stringtext,WidgetStylestyle)=>builder.Add(WidgetNodeFactory.UnformattedText(text,style));}publicclassUIBuilder{privatereadonlyList<IRenderable>_elements=new();publicUIBuilderAdd(IRenderableelement){_elements.Add(element);returnthis;}publicUIBuilderAdd(IEnumerable<IRenderable>elements){_elements.AddRange(elements);returnthis;}publicIRenderableRender()=>WidgetNodeFactory.Node(_elements);}
Something like
Where UI is a helper with extension methods: