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>

列にはいくつかのタイプがあり、そのうちの1つは説明列です。コントロールを使用する開発者に、説明列を常に最後に配置するように「強制」したいと思います(存在する場合)。カスタムマークアップ検証ルールを追加できますか?説明列が最後の位置以外の場所に配置されている場合、マークアップを赤い波線でマークできますか?このルールに違反した場合、Webサイトの検証に失敗することはできますか?

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 に答える