Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DotVVM中的自定义标记控件中呈现ITemplate_C#_.net Core_Dotvvm - Fatal编程技术网

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!);
        }
    }