2012-06-11 2 views
6

Использование MVVM. У меня есть DataTemplate, который я использую для отображения расширителя с некоторыми элементами управления в каждом объекте.Ошибка проверки расширителя WPF не показана при расширении

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

Внутри этого вида есть 2 текстовых поля, привязанных к этим 2 свойствам. Я использую IDataErrorInfo в моей виртуальной машине, чтобы сделать проверку, и я имею стиль в своих основных ресурсах приложения для отображения сообщений об ошибках в виде всплывающих подсказок:

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

Когда новая группа добавляется в 2 свойстве имеет значение по умолчанию, которые неверно, поэтому я хочу, чтобы текстовые поля были красными, чтобы предложить пользователю ввести данные. Это работает, если для параметра ExpExExExpanded установлено значение true. Но если это ложь, мне нужно расширить И изменить значение в одном из текстовых полей, чтобы отобразить красную рамку и всплывающую подсказку.

Я не хочу, чтобы расширитель расширялся, потому что в конечном итоге будет довольно много элементов управления. Как я могу получить красную рамку, чтобы показать, как только расширитель расширится? Еще лучше, есть ли способ расширить добавленный расширитель (когда пользователь добавляет новую группу, я добавляю PlatformGroupviewModel в observablecollection из PlatformGroupviewModels)?

EDIT более подробно: вид сверху уровня:

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

на PlatformGroups посмотреть:

<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

У вас есть 'ValidatesOnDataErrors = true' установить на ваших TextBox привязок? – Rachel

+0

Да, я делаю (хотя я не показывал код для 2 текстовых полей). Ошибка проверки подтверждается, если IsExpanded = true. Это, по-видимому, известная проблема с расширителями, но известное решение akjoshi, похоже, не работает в этом случае. – Nix

ответ

3

По this сообщению, упаковка ваших Expander содержания внутри AdornerDecorator должен решить эту проблему -

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

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

    </Expander> 
</DataTemplate> 

Другой SO нить, которая подтверждает это - Issue with WPF validation(IDataErrorInfo) and tab focusing

Некоторые другие обходные пути также упоминаются в этом ошибка подключения -

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

+0

Я пробовал, и это не имело значения. Расширитель сам вложен в другой расширитель, но наложение adornerdecorator на это тоже не помогло. Я обновлю свой вопрос еще немного кода. – Nix

+3

Наконец-то я вернулся к этому. Кажется, вам нужно позаботиться о том, где вы положили AdornerDecorator. Внутри моего представления PlatformGroup была панель стека, внутри которой была сетка, а текстовые поля были внутри сетки. Когда я помещал AdornerDecorator вокруг сетки, а не все содержимое расширителя, он работал. – Nix

+0

Рад, что вы нашли решение, да, иногда это становится сложно в WPF, и понять, какая именно причина этого сложна. – akjoshi