2010-07-29 73 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; 
    } 
}