private void OnModelChanged(object sender, ElementConstructModel model)
 {
     if (Model != model)
     {
         return;
     }
     _modelPreviewFragment = new RenderFragment(builder =>
     {
         builder.AddContent(0, model.ToMarkup());
     });
     StateHasChanged();
 }
        private RenderFragment BuildLink(ElementConstructModel model)
        {
            if (!(model is LinkConstructModel))
            {
                throw new ArgumentException(model.GetType().FullName);
            }

            RenderFragment RenderFragment(LinkConstructModel internalModel)
            {
                return(builder =>
                {
                    var index = 0;
                    builder.OpenElement(index++, "div");
                    builder.AddAttribute(index++, "class", "mat-elevation-z24");

                    builder.AddContent(index++, BuildFallback(internalModel, "Link"));
                    builder.OpenElement(index, "p");
                    builder.AddAttribute(index++, "class", "mat-subtitle2");
                    builder.AddContent(index++, "Link Content");
                    builder.CloseElement();

                    builder.OpenElement(index++, "input");
                    builder.AddAttribute(index++, "type", "input");
                    builder.AddAttribute(index++, "value", internalModel.Content);

                    builder.AddAttribute(index++, "onchange",
                                         EventCallback.Factory.CreateBinder(internalModel, value =>
                    {
                        internalModel.Content = value;
                        ModelChanged?.Invoke(this, internalModel);
                    },
                                                                            internalModel.Content));
                    builder.SetUpdatesAttributeName("value");

                    builder.AddAttribute(index++, "oninput",
                                         EventCallback.Factory.CreateBinder(internalModel, value =>
                    {
                        internalModel.Content = value;
                        ModelChanged?.Invoke(this, internalModel);
                    },
                                                                            internalModel.Content));
                    builder.SetUpdatesAttributeName("value");

                    builder.CloseElement();
                    builder.CloseElement();

                    builder.AddMarkupContent(index, "<hr />");
                });
            }

            return(RenderFragment((LinkConstructModel)model));
        }
        private RenderFragment BuildFallback(ElementConstructModel model, string modelName)
        {
            RenderFragment RenderFragment(ElementConstructModel internalModel)
            {
                return(builder =>
                {
                    var index = 0;

                    builder.OpenElement(index++, "div");
                    builder.AddAttribute(index++, "class", "mat-elevation-z7");

                    builder.OpenElement(index++, "p");
                    builder.AddAttribute(index++, "class", "mat-subtitle2");
                    builder.AddContent(index++, $"{modelName}:");
                    builder.CloseElement();
                    builder.OpenElement(index++, "input");
                    builder.AddAttribute(index++, "type", "input");
                    builder.AddAttribute(index++, "value", internalModel.Value);

                    builder.AddAttribute(index++, "onchange",
                                         EventCallback.Factory.CreateBinder(internalModel, value =>
                    {
                        internalModel.Value = value;
                        ModelChanged?.Invoke(this, internalModel);
                    },
                                                                            internalModel.Value));
                    builder.SetUpdatesAttributeName("value");

                    builder.AddAttribute(index++, "oninput",
                                         EventCallback.Factory.CreateBinder(internalModel, value =>
                    {
                        internalModel.Value = value;
                        ModelChanged?.Invoke(this, internalModel);
                    },
                                                                            internalModel.Value));
                    builder.SetUpdatesAttributeName("value");

                    builder.CloseElement();
                    builder.CloseElement();
                    builder.AddMarkupContent(index, "<hr />");
                });
            }

            return(RenderFragment(model));
        }