2012-06-11 33 views
6

Sử dụng MVVM. Tôi có một số DataTemplate mà tôi đang sử dụng để hiển thị một bộ mở rộng với một số điều khiển trong mỗi đối tượng.Lỗi xác thực giãn nở WPF không được hiển thị khi mở rộng

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

Trong chế độ xem đó là 2 hộp văn bản được ràng buộc với 2 thuộc tính đó. Tôi đang sử dụng IDataErrorInfo trong VM của tôi để làm xác nhận và tôi đã là một phong cách tài nguyên ứng dụng chính của tôi để hiển thị các thông báo lỗi như tooltips:

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

Khi một nhóm mới được thêm 2 thuộc tính có giá trị mặc định, không hợp lệ nên tôi muốn hộp văn bản màu đỏ để nhắc người dùng nhập dữ liệu. Điều này hoạt động nếu Expander's IsExpanded được đặt thành true. Nhưng nếu nó là sai tôi phải mở rộng và thay đổi giá trị trong một trong các hộp văn bản để có được đường viền màu đỏ và chú giải công cụ để hiển thị.

Tôi không muốn đặt trình mở rộng được mở rộng vì cuối cùng sẽ có một vài điều khiển. Làm thế nào tôi có thể nhận được biên giới màu đỏ để hiển thị ngay sau khi mở rộng được mở rộng? Thậm chí tốt hơn, là có một cách để làm cho mở rộng mới được mở rộng (khi người dùng thêm một nhóm mới tôi đang thêm một PlatformGroupviewModel để một observablecollection của PlatformGroupviewModels)? chi tiết

EDIT hơn: quan điểm trên mức:

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

các PlatformGroups xem:

<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

Bạn có 'ValidatesOnDataErrors = TRUE' đặt trên bindings TextBox của bạn? – Rachel

+0

Có, tôi làm (mặc dù tôi chưa hiển thị mã cho 2 hộp văn bản). Lỗi xác thực hiển thị nếu IsExpanded = true. Điều này có vẻ là một vấn đề được biết đến với những người mở rộng, nhưng giải pháp được biết đến mà akjoshi đã đăng dường như không hoạt động trong trường hợp này. – Nix

Trả lời

3

Theo this bưu điện, gói Expander nội dung của bạn bên trong một AdornerDecorator nên giải quyết vấn đề này -

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

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

    </Expander> 
</DataTemplate> 

Một thread SO mà xác nhận điều này - Issue with WPF validation(IDataErrorInfo) and tab focusing

Một số cách giải quyết khác cũng được đề cập trên lỗi kết nối này -

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

+0

Tôi đã thử và nó không có sự khác biệt. Các expander là chính nó lồng nhau trong một expander nhưng đặt adornerdecorator trên đó đã không giúp đỡ một trong hai. Tôi sẽ cập nhật câu hỏi của mình với mã nhiều hơn một chút. – Nix

+3

Cuối cùng tôi cũng đã quay lại điều này. Có vẻ như bạn phải chăm sóc chính xác nơi bạn đặt AdornerDecorator. Bên trong khung nhìn PlatformGroup của tôi là một bảng ngăn xếp, với một lưới bên trong, và các hộp văn bản nằm bên trong lưới. Khi tôi đặt AdornerDecorator xung quanh lưới điện, thay vì toàn bộ nội dung của thiết bị mở rộng, nó hoạt động. – Nix

+0

Rất vui khi bạn tìm thấy giải pháp, đôi khi nó trở nên phức tạp trong WPF và để hiểu lý do chính xác đằng sau những điều đó là khó khăn. – akjoshi

Các vấn đề liên quan