Как использовать правило проверки строки после изменения ячейки? - PullRequest
0 голосов
/ 06 июля 2019

Как я могу использовать свое правило проверки строк при каждом изменении ячейки?У меня есть 4 столбца: X, Y, Z, W. Каждая ячейка имеет свое собственное правило проверки, и мне нужно проверить, что сумма X + Z не превышает предела, то же самое для суммы Y + W. Iхотите проверять его каждый раз, когда пользователь изменяет значение ячейки.

<DataGrid x:Name="targetsDataGrid" ItemsSource="{x:Static local:Position.EmptyPositions}" AutoGenerateColumns="False" ColumnWidth="*" Height="210" HorizontalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Top" CanUserResizeColumns="False" CanUserSortColumns="False" HeadersVisibility="All" CanUserResizeRows="False" Margin="0,32,0,0" CellEditEnding="TargetsDataGrid_CellEditEnding">
  <DataGrid.Background>
    <SolidColorBrush Color="White" Opacity="0.35"/>
  </DataGrid.Background>
  <DataGrid.RowValidationRules>
    <local:RowValidationRule/>
  </DataGrid.RowValidationRules>
  <DataGrid.RowValidationErrorTemplate>
    <ControlTemplate>
      <Grid Margin="0,-2,0,-2" ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent}">
        <Ellipse StrokeThickness="0" Fill="Red" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}"/>
        <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" FontWeight="Bold" Foreground="White" HorizontalAlignment="Center"/>
      </Grid>
    </ControlTemplate>
  </DataGrid.RowValidationErrorTemplate>
    <DataGrid.Resources>
      <Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
        <Setter Property="Padding" Value="-2"/>
        <Style.Triggers>
          <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
          </Trigger>
        </Style.Triggers>
      </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
      <DataGridTextColumn Header="X" EditingElementStyle="{StaticResource errorStyle}">
        <DataGridTextColumn.Binding>
          <Binding Path="X">
            <Binding.ValidationRules>
              <local:PositionValidationRuleX/>
            </Binding.ValidationRules>
          </Binding>
        </DataGridTextColumn.Binding>
      </DataGridTextColumn>
      <DataGridTextColumn Header="Y" EditingElementStyle="{StaticResource errorStyle}">
      <DataGridTextColumn.Binding>
        <Binding Path="Y">
          <Binding.ValidationRules>
            <local:PositionValidationRuleY />
          </Binding.ValidationRules>
        </Binding>
      </DataGridTextColumn.Binding>
    </DataGridTextColumn>
    <DataGridTextColumn Header="Z" EditingElementStyle="{StaticResource errorStyle}" >
      <DataGridTextColumn.Binding>
        <Binding Path="Z">
          <Binding.ValidationRules>
            <local:PositionValidationRuleZ />
          </Binding.ValidationRules>
        </Binding>
      </DataGridTextColumn.Binding>
    </DataGridTextColumn>
    <DataGridTextColumn Header="W" EditingElementStyle="{StaticResource errorStyle}" >
      <DataGridTextColumn.Binding>
        <Binding Path="W">
          <Binding.ValidationRules>
            <local:PositionValidationRuleW />
          </Binding.ValidationRules>
        </Binding>
      </DataGridTextColumn.Binding>
    </DataGridTextColumn>
  </DataGrid.Columns>
</DataGrid>

1 Ответ

0 голосов
/ 07 июля 2019

При связывании свойства присвойте свойству UpdateSourceTrigger значение PropertyChanged

Для проверки строки. Вместо добавления ValidationRule в свойство RowValidationRules DataGrid вы можете реализовать интерфейс INotifyDataErrorInfo в классе модели представления и вызывать его событие ErrorChanged всякий раз, когда вы хотите обновить состояние строки / элемента.

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