自定义控件标记验证

时间:2012-12-16 15:35:40

标签: c# asp.net visual-studio-2010

我有一个自定义控件,其列集存储为标记中的内部属性。 标记看起来像这样:

<CustomGrid:CompositeGrid ID="myGrid1" runat="server" ReturnToFirstPageOnSort="true"
     PagerArrowsDisapearWhenNextPrevDisabled="true" AlternatingRowStyling="true">
        <Columns>
            <CustomGrid:DataColumn DataSourceID="TestDate" FormatString="dd.MM.yyyy"
                 Sortable="true" Visible="true" />
            <CustomGrid:DataColumn DataSourceID="TestType" />
            <CustomGrid:DataColumn DataSourceID="Referrer" />
            <CustomGrid:ImageColumn DataSourceID="StatusIcon"
                TextDataSourceID="Status" IncludeText="true" ImageAlt="IconAlt"
                ImageOnThe="Right" />
            <CustomGrid:LinkColumn>
                <Links>
                    <CustomGrid:LinkButtonItem CommandArgument="PDFId" CommandName="GetPDF" />
                    <CustomGrid:OpenDescriptionItem />
                </Links>
            </CustomGrid:LinkColumn>
            <CustomGrid:UserDefinedColumn ImplementingColumnType="MyColumn" HeaderText="User Defined Column" />
            <CustomGrid:DescriptionBlock DataSourceID="TestDate" />
        </Columns>
    </CustomGrid:CompositeGrid>

列有几种类型,其中一种类型是描述列。我想&#34;强迫&#34;开发人员使用控件始终将描述列放在最后(如果它完全存在)。我可以添加自定义标记验证规则吗?如果描述栏放在任何位置但位于最后位置,我可以用红色边框线标记标记吗?如果违反此规则,我可以通过网站验证失败吗?

1 个答案:

答案 0 :(得分:1)

我认为你应该为DescriptionColumn创建一个单独的属性,如果你想让它变得特别,那就把它变成一个不同的基类。或者,无论控件的用户如何定义列,您都可以随时对列进行排序。

<强>更新

好吧,我决定让你的想法去创造一个自定义异常。我认为您需要做的就是在自定义控件中处理这个案例并抛出自己的异常。没有自定义的XML验证规则,只是一个普通的.NET异常。

Custom XAML Exception

这是代码的相关部分。

public class DataGrid
{
    ObservableCollection<BaseColumn> columns = new ObservableCollection<BaseColumn>();

    public DataGrid()
    {
        columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(subClasses_CollectionChanged);
    }

    void subClasses_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        int count = columns.Count(x => x is DescriptionColumn);

        if (count > 1)
        {
            throw new CustomDataGridException("You can only have one description column");
        }
        if (count == 1)
        {
            if (!(columns[columns.Count - 1] is DescriptionColumn))
                throw new CustomDataGridException("Description column must be last");
        }
    }

    public ObservableCollection<BaseColumn> Columns
    {
        get
        {
            return columns;
        }

        set
        {

            if(columns != null)
                columns.CollectionChanged -= subClasses_CollectionChanged;

            columns = value;

            if (columns != null)
                columns.CollectionChanged += subClasses_CollectionChanged;
        }
    }
}

只需确保重新编译,关闭并重新打开设计器窗口,否则它可能无法更新。