6

使用 MVVM。我有一个DataTemplate用于显示每个对象中带有一些控件的扩展器。

<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在我的 VM 中使用来进行验证,并且我在我的主要应用程序资源中有一种样式来将错误消息显示为工具提示:

<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 个属性具有默认值,这是无效的,因此我希望文本框为红色以提示用户输入数据。如果 Expander 的 IsExpanded 设置为 true,则此方法有效。但如果它是假的,我必须扩展并更改其中一个文本框中的值,以便显示红色边框和工具提示。

我不想将扩展器设置为展开,因为最终会有很多控件。如何在扩展器展开后立即显示红色边框?更好的是,有没有办法让新添加的扩展器展开(当用户添加新组时,我正在将 PlatformGroupviewModel 添加到observablecollectionPlatformGroupviewModels 中)?

编辑更多细节:顶级视图:

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

1 回答 1

3

根据这篇Expander文章,将您的内容包装在 an 中AdornerDecorator应该可以解决这个问题 -

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

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

    </Expander>
</DataTemplate>

另一个确认这一点的 SO 线程 - WPF 验证问题(IDataErrorInfo)和标签聚焦

此连接错误还提到了其他一些解决方法 -

来回切换选项卡时,TabControl 无法正确显示验证错误信息

于 2012-06-11T11:33:11.497 回答