2012-06-11 14 views
6

Utilizzo di MVVM. Ho un DataTemplate che sto usando per visualizzare un expander con alcuni controlli in oggetto.Errore di convalida dell'espansione WPF non mostrato quando espanso

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

All'interno di questa vista sono presenti 2 caselle di testo associate a queste 2 proprietà. Sto utilizzando IDataErrorInfo nel mio VM di fare la convalida e non ho uno stile nelle mie principali risorse delle applicazioni per visualizzare i messaggi di errore come tooltip:

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

quando viene aggiunto un nuovo gruppo le 2 proprietà hanno valori di default, che non è valido, quindi voglio che le caselle di testo siano rosse per chiedere all'utente di inserire i dati. Funziona se Expander's IsExpanded è impostato su true. Ma se è falso, devo espandere E cambiare il valore in una delle caselle di testo per ottenere il bordo rosso e il suggerimento da mostrare.

Non voglio impostare l'espansione in modo che ci siano alcuni controlli. Come posso visualizzare il bordo rosso non appena viene espanso l'espansore? Ancora meglio, c'è un modo per espandere l'espansione dell'espansione appena aggiunta (quando l'utente aggiunge un nuovo gruppo sto aggiungendo un PlatformGroupviewModel a uno observablecollection di PlatformGroupviewModels)?

EDIT più in dettaglio: la vista di primo livello:

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

le 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

Avete 'ValidatesOnDataErrors = TRUE impostato sui vostri attacchi TextBox? – Rachel

+0

Sì, sì (anche se non ho mostrato il codice per le 2 caselle di testo). L'errore di convalida viene visualizzato se IsExpanded = true. Questo sembra essere un problema noto con gli expanderers, ma la soluzione nota che akjoshi ha pubblicato non sembra funzionare in questo caso. – Nix

risposta

3

Come da this inviati, avvolgendo il contenuto Expander all'interno di un AdornerDecorator dovrebbe risolvere questo problema -

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

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

    </Expander> 
</DataTemplate> 

Un altro SO thread che conferma questo - Issue with WPF validation(IDataErrorInfo) and tab focusing

Alcune altre soluzioni sono menzionate anche in questo connect bug -

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

+0

Ho provato e non ha fatto alcuna differenza. L'expander è a sua volta annidato in un altro expander, ma non ha aiutato nemmeno l'adornerdecorator. Aggiornerò la mia domanda con un po 'di codice in più. – Nix

+3

Sono finalmente tornato a questo. Sembra che tu debba fare attenzione esattamente dove metti AdornerDecorator. All'interno della mia vista PlatformGroup c'era un pannello dello stack, con una griglia all'interno e le caselle di testo erano all'interno della griglia. Quando ho messo AdornerDecorator sulla griglia, invece dell'intero contenuto dell'espansore, ha funzionato. – Nix

+0

Felice di aver trovato la soluzione, sì a volte diventa complicato in WPF e capire la ragione esatta dietro a queste cose è dura. – akjoshi