2012-12-16 105 views
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> 

有幾種類型的列,和類型之一是描述列。我想要使​​用控件「強制」開發人員始終將描述列放在最後(如果它存在的話)。我可以添加自定義標記驗證規則嗎?如果說明欄放置在最後位置的任何地方,我可以用紅色的波浪線標記標記嗎?如果違反此規則,我可以通過網站驗證嗎?

+0

我不認爲你可以做到這一點。但是無論如何,支持這一列的問題有哪些? –

+1

我認爲你應該爲DescriptionColumn創建一個單獨的屬性,並且如果你想讓它變得特殊,就使它成爲一個不同的基類。或者,無論控件的用戶如何定義列,您都可以始終對列進行排序。 – Alan

+0

@Alan:我同意..你應該讓你的評論成爲答案。 –

回答

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

只要確保重新編譯,關閉並重新打開設計器窗口,否則它可能不會更新。

+0

哈!這麼簡單:)我只是沒有想到將它移動到最後,如果它已經不存在了...我想有時候你需要有人來幫助你擺脫你的%$。關於非正統 - 我不完全同意。 asp.net標籤做了各種驗證。標記一個沒有'runat ='server'的標籤是第一個想到的。 –

+0

@EladLachmi看到我更新的答案,我希望你喜歡它。 – Alan

+0

現在我得到我的錢值得:)謝謝! –