WebForms:DataBind 到派生 CheckBox 控件的文本 属性

WebForms: DataBind to Text Property of derived CheckBox control

我有一个包含 CheckBox 控件的页面:

<asp:CheckBox ID="Save" runat="server" Text='<%= SomePageMethod("param") %>' />

效果很好,SomePageMethod 被调用并且页面在复选框旁边呈现正确的文本。

现在,我们正在做一些测试 WebForms 页面的工作,作为这项工作的一部分,我们构建了一个简单的派生 class 以便我们可以注入一个接口:

namespace MyControls
{
    public interface ICheckBox
    {
        bool Visible { get; set; }
    }

    public class CheckBox : ICheckBox, System.Web.UI.WebControls.CheckBox
    {
    }
}

然后我将 class 导入到我的页面上:

<%@ Register Namespace="MyControls" Assembly="MyControls" TagPrefix="vm" %>

并将控件定义更改为:

<vm:CheckBox ID="Save" runat="server" Text='<%= SomePageMethod("param") %>' />

现在,数据绑定表达式从未被调用,所以我的复选框没有文本。

知道为什么这行不通吗?我们使用这些控件所做的几乎所有其他操作都运行良好,但这个让我感到难过。

注意:编辑以消除在制作的界面中具有 Checked 属性 的歧义。

能不能在页面调用data bind这么简单? 我创建了一个反映您要求的小测试, 在我明确调用 DataBind() 之前文本没有绑定 在页面上或单独在每个控件上。

下面是 ASP CheckBox 和自定义 CheckBox 的示例 实现 ICheckBox

TestPage.aspx

...
<vm:CheckBox ID="VmCheckBox" runat="server" Text="<%# GetCheckBoxText(23)%>"/>
<asp:CheckBox ID="AspCheckBox" runat="server" Text="<%# GetCheckBoxText(23)%>" />

注意 我在活页夹中使用了 # 而不是 =,即 <%# ... %>

TestPage.aspx.cs

...
protected void Page_Load(object sender, EventArgs e)
{
    DataBind() // Binds all objects on page
    
    // ...Or individually bind controls
    VmCheckBox.DataBind()
    AspCheckBox.DataBind()
}