Проверка TextBox устанавливает красную границу кнопки - PullRequest
1 голос
/ 11 апреля 2019

У меня есть ItemsControl, где я динамически создаю новый GroupBox с несколькими элементами управления в нем и моделью позади. Это работает до сих пор. Я также реализовал проверку для моих TextBox es, которая также работает как задумано. И есть Button для удаления этого GroupBox, который связывается с Ancestor типа UserControl.

<ItemsControl Grid.Row="2" ItemsSource="{Binding StorageLocationList, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <GroupBox Style="{StaticResource GroupBoxBase}">
                <GroupBox.Header>
                    <CheckBox x:Name="ExportGroupCheckBox" Content="Storage Location active" IsChecked="{Binding GroupActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource CheckBoxBase}" IsEnabled="{Binding ElementName=ActivateExportCheckBox, Path=IsChecked}"/>
                </GroupBox.Header>
                <Grid>
                    <Grid IsEnabled="{Binding ElementName=ExportGroupCheckBox, Path=IsChecked}">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Label Grid.Row="0" Grid.Column="0" Content="Name:" VerticalAlignment="Center"/>
                        <TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource LimitedCharTextBox}" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}"/>
                        <Label Grid.Row="1" Grid.Column="0" Content="Storage Location:" VerticalAlignment="Center"/>
                        <TextBox Grid.Row="1" Grid.Column="1" IsReadOnly="True" Style="{StaticResource BaseTextBox}" Text="{Binding StorageLocationPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}"/>
                        <Button Grid.Row="1" Grid.Column="2" Content="Browse..." VerticalAlignment="Stretch" Command="{Binding StorageLocationBrowseCommand}" Style="{StaticResource ButtonBase}"/>
                    </Grid>
                    <Canvas>
                        <Button Canvas.Top="0" Canvas.Right="0" Content="X" ToolTip="Remove Group" Style="{StaticResource RemoveButton}" Command="{Binding ElementName=GPUserControl, Path=DataContext.RemoveStorageLocationGroupCommand}" CommandParameter="{Binding}"/>
                    </Canvas>
                </Grid>
            </GroupBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Когда я сейчас что-то не так набираю в TextBox, который связан со свойством Name, происходит проверка, и TextBox получает красную рамку, чтобы указать это. Здорово. Но кнопка для удаления этого GroupBox также получает красную рамку. И это странно.

Я также попытался установить Validation.ErrorTemplate для Button на null следующим образом:

<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>

но это также устанавливает TextBox Validation.ErrorTemplate на null.

Так как они связаны друг с другом? Как-то через UserControl?

Вот скриншот этого: enter image description here

EDIT: Вот такие Styles:

<Style x:Key="BaseTextBox" TargetType="TextBox">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
        </Trigger>
        <Trigger Property="IsReadOnly" Value="True">
            <Setter Property="Background" Value="LightGray"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="GroupBoxBase" TargetType="GroupBox">
    <Setter Property="Padding" Value="2"/>
</Style>

<Style x:Key="ConfigurationMainWindownButton" TargetType="Button">
    <Setter Property="Height" Value="Auto"/>
    <Setter Property="Width" Value="70"/>
    <Setter Property="Margin" Value="2,2,2,2"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

<Style x:Key="RemoveButton" TargetType="Button" BasedOn="{StaticResource ConfigurationMainWindownButton}">
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="HorizontalAlignment" Value="Right"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Width" Value="20"/>
    <Setter Property="Height" Value="20"/>
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <!-- <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/> -->
</Style>

1 Ответ

0 голосов
/ 23 мая 2019

WPF помечает все элементы ItemsControl как недействительные, а не только текстовое поле внутри из-за использования одной и той же модели данных (на самом деле модель недействительна - не контролирует). В текстовом поле просто установите недопустимое значение. Вы можете решить эту проблему с помощью переопределения параметра стиля Validation.ErrorTemplate для элемента управления «Удалить группу», если кнопка должна игнорировать состояние проверки модели.

<Setter Property="Validation.ErrorTemplate">

        <Setter.Value>

            <ControlTemplate>

                        <AdornedElementPlaceholder />
            </ControlTemplate>

        </Setter.Value>

    </Setter>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...