C# 在DotVVM中的自定义标记控件中呈现ITemplate
我正在尝试创建一个自定义控件,用于呈现可以选择日期的日历。我需要能够将C# 在DotVVM中的自定义标记控件中呈现ITemplate,c#,.net-core,dotvvm,C#,.net Core,Dotvvm,我正在尝试创建一个自定义控件,用于呈现可以选择日期的日历。我需要能够将ITemplate传递给控件,该控件将每天呈现。这些天是由一个转发器呈现的 由于目前没有允许绑定到ITemplate(或将ITemplate与集合以外的任何对象一起使用)的现有控件,如何从controlProperty轻松呈现ITemplate? 我更喜欢使用某种控件,只渲染ITemplate,这样它就可以在其他地方重用 部分控制标记: <!-- ... --> <dot:Repeater I
ITemplate
传递给控件,该控件将每天呈现。这些天是由一个转发器呈现的
由于目前没有允许绑定到ITemplate
(或将ITemplate
与集合以外的任何对象一起使用)的现有控件,如何从controlProperty
轻松呈现ITemplate
?
我更喜欢使用某种控件,只渲染ITemplate
,这样它就可以在其他地方重用
部分控制标记:
<!-- ... -->
<dot:Repeater ID="DaysRepeater" DataSource="{value: Days}" class="list-group list-group-flush calendar-grid">
<ItemTemplate>
<div class="{{value: "calendar-day calendar-day-" + DayOfWeekIndex }}">
<dot:LinkButton ID="DayButton" class="{{value: "list-group-item list-group-item-action " + (Selected ? "active calendar-day-btn" : "calendar-day-btn") }}"
Click="{controlCommand: SelectDate(_this.Date)}">
{{value: DayText}}
<!-- RENDER TEMPLATE HERE -->
</dot:LinkButton>
</div>
</ItemTemplate>
</dot:Repeater>
{{value:DayText}}
代码隐藏中的ItemTemplate:
[MarkupOptions(AllowBinding = false, MappingMode = MappingMode.InnerElement, Required = false)]
[ConstantDataContextChange(typeof(ICollection<CalendarDayModel>)), CollectionElementDataContextChange(1)]
public ITemplate ItemTemplate
{
get { return (ITemplate)GetValue(ItemTemplateProperty)!; }
set { SetValue(ItemTemplateProperty, value); }
}
public static readonly DotvvmProperty ItemTemplateProperty =
DotvvmProperty.Register<ITemplate, Calendar>(t => t.ItemTemplate);
[标记选项(AllowBinding=false,MappingMode=MappingMode.InnerElement,Required=false)]
[ConstantDataContextChange(typeof(ICollection)),CollectionElementDataContextChange(1)]
公共项目板项目模板
{
获取{return(ITemplate)GetValue(ItemTemplateProperty)!;}
set{SetValue(ItemTemplateProperty,value);}
}
公共静态只读DotvvmProperty ItemTemplateProperty=
DotvvmProperty.Register(t=>t.ItemTemplate);
控件的示例用法:
<cc:Calendar DataContext="{value: CalendarViewModel}" MultiSelect="true">
<ItemTemplate>
Selected: {{value: Selected}}
</ItemTemplate>
</cc:Calendar>
选定:{{值:选定}
不幸的是,DotVVM中没有任何控件可以绑定模板并只渲染它。但是,您可以执行以下操作:
中继器的模板中使用占位符控件:
<dot:Repeater ID="DaysRepeater" DataSource="{value: Days}" class="list-group list-group-flush calendar-grid">
<ItemTemplate>
<div class="{{value: "calendar-day calendar-day-" + DayOfWeekIndex}}">
<dot:LinkButton ID="DayButton" class="{{value: "list-group-item list-group-item-action " + (Selected ? "active calendar-day-btn" : "calendar-day-btn") }}"
Click="{controlCommand: SelectDate(_this.Date)}">
{{value: DayText}}
<dot:PlaceHolder ID="TemplateHost" />
</dot:LinkButton>
</div>
</ItemTemplate>
</dot:Repeater>
protected override void OnInit(IDotvvmRequestContext context)
{
var repeater = (Repeater)FindControlInContainer("DaysRepeater");
repeater!.ItemTemplate = new TemplateWrapper(ItemTemplate, repeater!.ItemTemplate);
base.OnInit(context);
}
class TemplateWrapper : ITemplate
{
private readonly ITemplate innerTemplate;
private readonly ITemplate repeaterTemplate;
public TemplateWrapper(ITemplate innerTemplate, ITemplate repeaterTemplate)
{
this.innerTemplate = innerTemplate;
this.repeaterTemplate = repeaterTemplate;
}
public void BuildContent(IDotvvmRequestContext context, DotvvmControl container)
{
repeaterTemplate.BuildContent(context, container);
var placeholder = container.FindControlInContainer("TemplateHost");
innerTemplate.BuildContent(context, placeholder!);
}
}