2010-07-29 78 views
2

我面臨以下問題:我使用驗證摘要彈出窗口顯示頁面上的錯誤,並且我有一個可編輯的DataGrid。所以有兩個問題:如何禁用Silverlight DataGrid驗證頁腳?

1)DataGrid驗證重複驗證錯誤,如果它發生在DataGrid單元格中。例如。 DataGrid包含對象IEnumerable的集合。當我爲集合中的每個對象執行ComplexObject.Validate()時,我會在DataGrid頁腳中的每個不正確的對象上出現1個驗證錯誤,而在我的驗證摘要彈出窗口中出現2個相同的錯誤。我嘗試過使用另一個Datagrid(Telerik),它工作得很好,所以我認爲它是DataGrid的問題,儘管Telerik控件不適合我。

2)DataGrid驗證腳是多餘的,我想刪除/隱藏它。

有什麼辦法可以同時實現兩個選項嗎?提前致謝。

回答

3

要刪除datagrid驗證摘要(問題#2),請使用混合或反射器提取樣式,將其粘貼到Style資源字典中,並刪除驗證摘要控件。

然後引用datagrid聲明中的樣式(Style = {StaticResource DataGridOverrideStyle})。下面是Silverlight 4中的XAML,如果你不具備反射器或混合:

<Style TargetType="local:DataGrid" x:Key="DataGridOverrideStyle"> 
    <Setter Property="RowBackground" Value="#AAEAEFF4" /> 
    <Setter Property="AlternatingRowBackground" Value="#00FFFFFF" /> 
    <Setter Property="Background" Value="#FFFFFFFF" /> 
    <Setter Property="HeadersVisibility" Value="Column" /> 
    <Setter Property="HorizontalScrollBarVisibility" Value="Auto" /> 
    <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> 
    <Setter Property="SelectionMode" Value="Extended" /> 
    <Setter Property="CanUserReorderColumns" Value="True" /> 
    <Setter Property="CanUserResizeColumns" Value="True" /> 
    <Setter Property="CanUserSortColumns" Value="True" /> 
    <Setter Property="AutoGenerateColumns" Value="True" /> 
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" /> 
    <Setter Property="BorderBrush"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FFA3AEB9" Offset="0"/> 
       <GradientStop Color="#FF8399A9" Offset="0.375"/> 
       <GradientStop Color="#FF718597" Offset="0.375"/> 
       <GradientStop Color="#FF617584" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="DragIndicatorStyle"> 
     <Setter.Value> 
      <!-- TODO: Change the TargetType to Control when the fix Jolt bugs 18719 is verified --> 
      <Style TargetType="ContentControl"> 
       <Setter Property="Foreground" Value="#7FFFFFFF" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <!-- TODO: Change the TargetType to Control when the fix Jolt bugs 18719 is verified --> 
         <ControlTemplate TargetType="ContentControl"> 
          <Grid> 
           <VisualStateManager.VisualStateGroups> 
            <VisualStateGroup x:Name="SortStates"> 
             <VisualState x:Name="Unsorted" /> 
             <VisualState x:Name="SortAscending"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0"/> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="SortDescending"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0"/> 
               <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="(RenderTransform).ScaleY" Duration="0" To="-.9"/> 
              </Storyboard> 
             </VisualState> 
            </VisualStateGroup> 
           </VisualStateManager.VisualStateGroups> 

           <Rectangle x:Name="BackgroundRectangle" Stretch="Fill" Fill="#66808080" Grid.ColumnSpan="2" /> 

           <Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2" Opacity="0" > 
            <Rectangle.Fill> 
             <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
              <GradientStop Color="#FFFFFFFF" Offset="0.015" /> 
              <GradientStop Color="#F9FFFFFF" Offset="0.375" /> 
              <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
              <GradientStop Color="#C6FFFFFF" Offset="1" /> 
             </LinearGradientBrush> 
            </Rectangle.Fill> 
           </Rectangle> 

           <Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition/> 
             <ColumnDefinition Width="Auto" /> 
            </Grid.ColumnDefinitions> 

            <ContentPresenter Content="{TemplateBinding Content}"/> 

            <Path Grid.Column="1" Name="SortIcon" Fill="#7FFFFFFF" RenderTransformOrigin=".5,.5" HorizontalAlignment="Left" VerticalAlignment="Center" Opacity="0" Stretch="Uniform" Width="8" Margin="4,0,0,0" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "> 
             <Path.RenderTransform> 
              <ScaleTransform ScaleX=".9" ScaleY=".9" /> 
             </Path.RenderTransform> 
            </Path> 
           </Grid> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="DropLocationIndicatorStyle"> 
     <Setter.Value> 
      <Style TargetType="ContentControl"> 
       <Setter Property="Background" Value="#FF3F4346"/> 
       <Setter Property="Width" Value="2"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ContentControl"> 
          <Rectangle Fill="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"/> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="GridLinesVisibility" Value="Vertical" /> 
    <Setter Property="HorizontalGridLinesBrush" Value="#FFC9CACA" /> 
    <Setter Property="IsTabStop" Value="True" /> 
    <Setter Property="VerticalGridLinesBrush" Value="#FFC9CACA" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:DataGrid"> 
       <Grid> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="2"> 
         <Grid Name="Root" Background="{TemplateBinding Background}"> 
          <Grid.Resources> 
           <!--Start: TopLeftHeaderTemplate--> 
           <ControlTemplate x:Key="TopLeftHeaderTemplate" TargetType="localprimitives:DataGridColumnHeader"> 
            <Grid Name="Root"> 
             <Grid.RowDefinitions> 
              <RowDefinition/> 
              <RowDefinition/> 
              <RowDefinition Height="Auto" /> 
             </Grid.RowDefinitions> 
             <Border BorderThickness="0,0,1,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2"> 
              <Rectangle Stretch="Fill" StrokeThickness="1"> 
               <Rectangle.Fill> 
                <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
                 <GradientStop Color="#FCFFFFFF" Offset="0.015" /> 
                 <GradientStop Color="#F7FFFFFF" Offset="0.375" /> 
                 <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
                 <GradientStop Color="#D1FFFFFF" Offset="1" /> 
                </LinearGradientBrush> 
               </Rectangle.Fill> 
              </Rectangle> 
             </Border> 
             <Rectangle VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFDBDCDC" Grid.RowSpan="2"/> 
            </Grid> 
           </ControlTemplate> 
           <!--End: TopLeftHeaderTemplate--> 

           <!--Start: TopRightHeaderTemplate--> 
           <ControlTemplate x:Key="TopRightHeaderTemplate" TargetType="localprimitives:DataGridColumnHeader"> 
            <Grid Name="RootElement"> 
             <Grid.RowDefinitions> 
              <RowDefinition/> 
              <RowDefinition/> 
              <RowDefinition Height="Auto" /> 
             </Grid.RowDefinitions> 
             <Border BorderThickness="1,0,0,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2"> 
              <Rectangle Stretch="Fill"> 
               <Rectangle.Fill> 
                <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
                 <GradientStop Color="#FCFFFFFF" Offset="0.015" /> 
                 <GradientStop Color="#F7FFFFFF" Offset="0.375" /> 
                 <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
                 <GradientStop Color="#D1FFFFFF" Offset="1" /> 
                </LinearGradientBrush> 
               </Rectangle.Fill> 
              </Rectangle> 
             </Border> 
            </Grid> 
           </ControlTemplate> 
           <!--End: TopRightHeaderTemplate--> 
          </Grid.Resources> 

          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto" /> 
           <RowDefinition/> 
           <RowDefinition Height="Auto" /> 
           <RowDefinition Height="Auto" /> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition/> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 

          <localprimitives:DataGridColumnHeader Name="TopLeftCornerHeader" Template="{StaticResource TopLeftHeaderTemplate}" Width="22" /> 
          <localprimitives:DataGridColumnHeadersPresenter Name="ColumnHeadersPresenter" Grid.Column="1"/> 
          <localprimitives:DataGridColumnHeader Name="TopRightCornerHeader" Grid.Column="2" Template="{StaticResource TopRightHeaderTemplate}" /> 
          <Rectangle Name="ColumnHeadersAndRowsSeparator" Grid.ColumnSpan="3" VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFC9CACA"/> 

          <localprimitives:DataGridRowsPresenter Name="RowsPresenter" Grid.ColumnSpan="2" Grid.Row="1" /> 
          <Rectangle Name="BottomRightCorner" Fill="#FFE9EEF4" Grid.Column="2" Grid.Row="2" /> 
          <Rectangle Name="BottomLeftCorner" Fill="#FFE9EEF4" Grid.Row="2" Grid.ColumnSpan="2" /> 
          <ScrollBar Name="VerticalScrollbar" Orientation="Vertical" Grid.Column="2" Grid.Row="1" Width="18" Margin="0,-1,-1,-1"/> 

          <Grid Grid.Column="1" Grid.Row="2"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition/> 
           </Grid.ColumnDefinitions> 
           <Rectangle Name="FrozenColumnScrollBarSpacer" /> 
           <ScrollBar Name="HorizontalScrollbar" Grid.Column="1" Orientation="Horizontal" Height="18" Margin="-1,0,-1,-1"/> 
          </Grid> 

          <!--<dataInput:ValidationSummary Name="ValidationSummary" Grid.Row="3" Grid.ColumnSpan="3" MaxHeight="0" />--> 
         </Grid> 
        </Border> 
        <Border x:Name="DisabledVisualElement" IsHitTestVisible="False" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" CornerRadius="2" Background="#8CFFFFFF" Opacity="0"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
1

另一種解決方案是繼承DataGrid和在OnApplyTemplate重寫ValidationSummary控件的MaxHeight設置爲零。類似這樣的:

public class NoValidationSummaryDataGrid : DataGrid 
{ 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     var summaryCtrl = GetTemplateChild("ValidationSummary"); 
     ((ValidationSummary)summaryCtrl).MaxHeight = 0; 
    } 
}