В последнее время я изо всех сил пытался заставить мою проверку работать над моей 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 завершается успешно, даже если есть строка, которая недопустима:
Вероятно, я чего-то не понимаю, но как новичок WPF я не могупонять это.
* Я изменил текст заголовка в примерах кода, но они не изменились в изображениях, я также оставил некоторые поля в коде (чтобы сделать его более читабельным), но они также не удаленыв изображениях.