2012-06-11 23 views
6

Używanie MVVM. Mam DataTemplate, którego używam do wyświetlania ekspandera z niektórymi kontrolkami w każdym obiekcie.Błąd sprawdzania poprawności ekspandera WPF nie został wyświetlony po rozwinięciu

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

Wewnątrz tego widoku znajdują się 2 pola tekstowe powiązane z tymi 2 właściwościami. Używam IDataErrorInfo w moim VM zrobić walidację i mam styl w moich głównych zasobów aplikacji do wyświetlania komunikatów o błędach jako podpowiedzi:

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

Kiedy nowa grupa 2 dodaje się właściwości mają wartości domyślne, które jest nieprawidłowy, więc chcę, aby pola tekstowe były czerwone, aby zachęcić użytkownika do wprowadzenia danych. Działa to, jeśli właściwość ExpEye IsExpanded ma wartość true. Ale jeśli jest to fałsz, muszę rozwinąć ORAZ zmienić wartość w jednym z pól tekstowych, aby uzyskać czerwoną ramkę i podpowiedź do wyświetlenia.

Nie chcę ustawić rozszerzenia ekspandera, ponieważ w końcu będzie sporo kontrolek. Jak mogę wyświetlić czerwoną ramkę, gdy ekspander zostanie rozszerzony? Nawet lepiej, czy istnieje sposób na rozszerzenie ekspandera nowo dodanego (kiedy użytkownik dodaje nową grupę, dodam platformę GroupGroupviewModel do observablecollection platformy PlatformGroupviewModels)?

EDIT bardziej szczegółowo: widok z góry poziom:

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

się PlatformGroups zobaczyć:

<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

Czy masz 'ValidatesOnDataErrors = TRUE ustawione na swoich powiązaniach TextBox? – Rachel

+0

Tak, robię (chociaż nie pokazałem kodu dla 2 pól tekstowych). Błąd sprawdzania poprawności wyświetla się, jeśli IsExpanded = true. Wydaje się, że jest to znany problem z ekspanderami, ale znane rozwiązanie, które opublikował akjoshi, nie działa w tym przypadku. – Nix

Odpowiedz

3

Zgodnie this poczta, owijając swoje treści Expander wewnątrz AdornerDecorator powinno rozwiązać ten problem -

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

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

    </Expander> 
</DataTemplate> 

Innym SO wątku to potwierdza - Issue with WPF validation(IDataErrorInfo) and tab focusing

Niektóre inne Obejścia są również wymienione na tej connect bug -

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

+0

Próbowałem i nie miało to żadnego znaczenia. Sam ekspander jest zagnieżdżony w innym ekspanderze, ale nie pomógł także ten adornerdecorator. Zaktualizuję moje pytanie za pomocą nieco więcej kodu. – Nix

+3

W końcu wróciłem do tego. Wygląda na to, że musisz uważać dokładnie tam, gdzie umieścisz AdornerDecorator. Wewnątrz mojego widoku GroupGroup znajdował się panel stosu, z siatką wewnątrz, a pola tekstowe znajdowały się wewnątrz siatki. Kiedy ustawiłem AdornerDecorator wokół siatki, zamiast całej zawartości ekspandera, zadziałało. – Nix

+0

Cieszę się, że znalazłeś rozwiązanie, tak czasami staje się trudne w WPF i zrozumieć dokładny powód tych rzeczy jest trudne. – akjoshi