Использование условия MultiDataTrigger для кнопки для ошибок DataGrid - PullRequest
0 голосов
/ 24 декабря 2018

В последнее время я изо всех сил пытался заставить мою проверку работать над моей DataGrid.После некоторого исследования я заставил это работать, но теперь я сталкиваюсь со следующей проблемой.

Я хочу отключить кнопку «Сохранить», когда в представлении / форме есть ошибки.Я делаю это, используя MultiDataTrigger.Conditions на моей кнопке:

<Button
    Name="SaveButton"
    Content="{Binding SaveContext}"
    Margin="2,50"
    Grid.Row="3" 
    Command="{Binding SaveCommand}"
>
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedButton}">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=(Validation.HasError), ElementName=NameTextBox}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError), ElementName=WidthTextBox}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError), ElementName=Combobox}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError), ElementName=MainGrid}" Value="False"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="True"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

. Это работает для первых 3 условий (эти поля отсутствуют в DataGrid), хотя условие для самой DataGrid неза работой.Сетка данных выглядит следующим образом:

<DataGrid x:Name="MainGrid" 
            ItemsSource="{Binding ItemList}"
            SelectedItem="{Binding SelectedItem,Converter={StaticResource ignoreNewItemPlaceHolderConverter}}" 
            AutoGenerateColumns="False"
            DataContextChanged="OnMainGridDataContextChanged" 
            CanUserAddRows="False" >

    <DataGrid.Columns>

        <DataGridTextColumn>
            <DataGridTextColumn.Header>
                <Grid Margin="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="16"/>
                    </Grid.ColumnDefinitions>
                        <Button
                            Command="{Binding Path=DataContext.AddRowCommand, 
                                RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                        >
                        </Button>
                    </Grid>
            </DataGridTextColumn.Header>
        </DataGridTextColumn>

        <DataGridTextColumn Binding="{Binding SequenceNumber}" 
                    Header="Line"
                    EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"
                    IsReadOnly="true" />

        <DataGridTextColumn Header="Width" IsReadOnly="false" EditingElementStyle="{StaticResource errTemplate}" >
            <DataGridTextColumn.Binding>
                <Binding Path="Width" ValidatesOnDataErrors="True">
                    <Binding.ValidationRules>
                        <validationbinding1:RequiredRule ValidatesOnTargetUpdated="True"/>
                        <validationbinding1:NumericRule ValidatesOnTargetUpdated="True" />
                    </Binding.ValidationRules>
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>

        <DataGridTextColumn Header="Height" IsReadOnly="false" EditingElementStyle="{StaticResource errTemplate}" >
            <DataGridTextColumn.Binding>
                <Binding Path="Hoogte" ValidatesOnDataErrors="True">
                    <Binding.ValidationRules>
                        <validationbinding1:RequiredRule />
                        <validationbinding1:NumericRule />
                    </Binding.ValidationRules>
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>

    </DataGrid.Columns>
</DataGrid>

Ошибки в сетке данных отображаются в виде всплывающей подсказки (errTemplate):

<Style TargetType="TextBox" x:Key="errTemplate">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
            Value="{Binding RelativeSource={x:Static RelativeSource.Self},
            Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Правилами проверки являются классы, которые наследуются от ValidationRule которые возвращают ValidationResult.

Проверка строки работает, но по некоторым причинам проверка всей DataGrid завершается успешно, даже если есть строка, которая недопустима:

enter image description here

enter image description here

Вероятно, я чего-то не понимаю, но как новичок WPF я не могупонять это.

* Я изменил текст заголовка в примерах кода, но они не изменились в изображениях, я также оставил некоторые поля в коде (чтобы сделать его более читабельным), но они также не удаленыв изображениях.

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