2012-06-11 17 views
6

Uso de MVVM. Tengo un DataTemplate que estoy usando para mostrar un expansor con algunos controles en cada objeto.El error de validación del expansor WPF no se muestra cuando está expandido

<DataTemplate> 
    <Expander ExpandDirection="Down" IsExpanded="False"> 
     <Expander.Header> 
      <TextBlock> 
       <TextBlock.Text> 
        <MultiBinding StringFormat="Platform Group {0} {1}"> 
         <Binding Path="PlatformGroupCode"/> 
         <Binding Path="PlatformGroupName"/> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </Expander.Header> 
     <vw:PlatformGroup HorizontalAlignment="Left"/> 
    </Expander> 
</DataTemplate> 

Dentro de esa vista hay 2 cuadros de texto enlazados a esas 2 propiedades. Estoy usando IDataErrorInfo en mi máquina virtual para hacer la validación y no tengo un estilo en mis principales recursos de la aplicación para mostrar mensajes de error como información sobre herramientas:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

cuando se añade un nuevo grupo de las 2 propiedades tienen valores por defecto, el cual no es válido, por lo que quiero que los cuadros de texto sean rojos para solicitar al usuario que ingrese datos. Esto funciona si el Expansor IsExpanded está establecido en verdadero. Pero si es falso, tengo que expandir Y cambiar el valor en uno de los cuadros de texto para que se muestren el borde rojo y la información sobre herramientas.

No quiero configurar el expansor para que se expanda porque eventualmente habrá bastantes controles. ¿Cómo puedo obtener el borde rojo para mostrar tan pronto como se expande el expansor? Aún mejor, ¿hay alguna manera de expandir el expansor recién agregado (cuando el usuario agrega un nuevo grupo, agrego un PlatformGroupviewModel a un observablecollection de PlatformGroupviewModels)?

EDITAR más detalle: la vista superior nivel:

<StackPanel Orientation="Vertical"> 
     <ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="630"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="5*" /> 
        <ColumnDefinition Width="5*" /> 
       </Grid.ColumnDefinitions> 
       <StackPanel Orientation="Vertical" Grid.ColumnSpan="2" Grid.Row="1" HorizontalAlignment="Stretch"> 
        <Expander ExpandDirection="Down" IsExpanded="True" Header="Header" HorizontalAlignment="Stretch" Name="expHeader" VerticalAlignment="Top"> 
         <vw:Header DataContext="{Binding HeaderVM}"/> 
        </Expander> 
        <Expander ExpandDirection="Down" IsExpanded="True" Header="Platform Groups" HorizontalAlignment="Stretch" Name="expPlatformGroups" VerticalAlignment="Top"> 
         <AdornerDecorator> 
          <vw:PlatformGroups DataContext="{Binding PlatformGroupsVM}"/> 
         </AdornerDecorator> 
        </Expander> 
       </StackPanel> 
      </Grid> 
     </ScrollViewer> 
</StackPanel> 

los PlatformGroups Vista:

<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch" Margin="10,10,10,10"> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Margin="0,10"> 
     <Label Content="Number of platform groups" VerticalAlignment="Center"/> 
     <vw:IntegerInput MinValue="0" MaxValue="50" MaxLength="2" Text="{Binding Path=NumPlatformGroups, Mode=TwoWay,ValidatesOnDataErrors=True}" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
    </StackPanel> 
    <ItemsControl IsTabStop="False" ItemsSource="{Binding PlatformGroups}" Margin="20,10" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Expander ExpandDirection="Down" IsExpanded="False"> 
        <Expander.Header> 
         <TextBlock> 
          <TextBlock.Text> 
           <MultiBinding StringFormat="Platform Group {0} {1}"> 
            <Binding Path="PlatformGroupCode"/> 
            <Binding Path="PlatformGroupName"/> 
           </MultiBinding> 
          </TextBlock.Text> 
         </TextBlock> 
        </Expander.Header> 
        <AdornerDecorator> 
         <vw:PlatformGroup HorizontalAlignment="Left"/> 
        </AdornerDecorator> 
       </Expander> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.Template> 
      <ControlTemplate> 
       <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" 
     BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True"> 
        <ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="400" CanContentScroll="True" Padding="{TemplateBinding Control.Padding}" Focusable="False"> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </ItemsControl.Template> 
    </ItemsControl> 
</StackPanel> 
+0

¿Tiene 'ValidatesOnDataErrors = TRUE encuentra en las fijaciones de cuadro de texto? – Rachel

+0

Sí, lo hago (aunque no he mostrado el código para los 2 cuadros de texto). El error de validación aparece si IsExpanded = true. Este parece ser un problema conocido con los expansores, pero la solución conocida que se publicó akjoshi no parece funcionar en este caso. – Nix

Respuesta

3

Según this posterior, envolviendo su contenido Expander dentro de un AdornerDecorator debería resolver este problema -

<DataTemplate> 
    <Expander ExpandDirection="Down" IsExpanded="False"> 
     <Expander.Header> 
      ... 
     </Expander.Header> 

     <AdornerDecorator> 
      <vw:PlatformGroup HorizontalAlignment="Left"/> 
     </AdornerDecorator> 

    </Expander> 
</DataTemplate> 

Otro SO hilo que lo confirma - Issue with WPF validation(IDataErrorInfo) and tab focusing

Algunas soluciones temporales también se mencionan en este error de conexión -

TabControl doesn't display Validation error information correctly when switching tabs back and forth

+0

Lo intenté y no hizo ninguna diferencia. El expansor está anidado en otro expansor, pero poner el adornerdecorator tampoco ayudó. Actualizaré mi pregunta con un poco más de código. – Nix

+3

Finalmente he vuelto a esto. Parece que debes cuidar exactamente dónde colocas el AdornerDecorator. Dentro de mi vista PlatformGroup había un panel de pila, con una grilla adentro, y los cuadros de texto estaban dentro de la grilla. Cuando puse AdornerDecorator en la cuadrícula, en lugar de todo el contenido del expansor, funcionó. – Nix

+0

Me alegro de que haya encontrado la solución, sí, a veces resulta complicado en WPF y comprender la razón exacta detrás de esas cosas es difícil. – akjoshi

Cuestiones relacionadas