1

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

<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>

列有多种类型,其中一种类型是描述列。我想使用控件“强制”开发人员始终将描述列放在最后(如果它存在的话)。我可以添加自定义标记验证规则吗?如果描述列放置在最后一个位置之外的任何位置,我可以用红色波浪线标记标记吗?如果违反此规则,我能否通过网站验证?

4

1 回答 1

1

我认为你应该为 DescriptionColumn 创建一个单独的属性,如果你想让它变得特别,就让它成为一个不同的基类。或者,您可以始终以这种方式对列进行排序,而不管控件的用户如何定义列。

更新

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

自定义 XAML 异常

这是代码的相关部分。

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

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

于 2012-12-28T17:19:39.070 回答