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>
Czy masz 'ValidatesOnDataErrors = TRUE ustawione na swoich powiązaniach TextBox? – Rachel
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