3

DataGrid に DataSet を設定しています。各 DataGridColumn で make によって validationRules に対して dataGrid を有効にしていますが、 DataErrors を持つValidatesOnDataError=Trueを追加するとブロックされ、他に何もできず、修正もできませんDataGridRowDataGridRowDataGridRow

     <!--Template for DataGridRow in Error state-->        
                <ControlTemplate x:Key="BasicRowValidationErrorTemplate">
                    <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>

     <!--Style for DataGridCell in static mode-->
            <Style x:Key="textBlockInError" TargetType="{x:Type TextBlock}">
                <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>

    <!--Style for DataGridCell in edit mode-->
            <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="true">
                        <Setter Property="Background" Value="Red"/>
                        <Setter Property="ToolTip"
                  Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                  Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>

そして、私は自分の列を次のように定義しました

<DataGrid>
   <DataGrid.RowValidationRules>
      <DataErrorValidationRule ValidationStep="ComittedValue"/>
   </DataGrid.RowValidationRules>
   <DataGrid.Columns>
    <DataGridTextColumn Header="Nombre" Binding="{Binding Nombre, UpdateSourceTrigger=PropertyChanged,
                        ValidatesOnDataErrors=True}" ElementStyle="{StaticResource textBlockInError}" 
                                        EditingElementStyle="{StaticResource textBoxInError}"/>    
    <DataGridTemplateColumn Header="Price">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Price, ValidatesOnDataErrors=True}" Style="{StaticResource textBlockInError}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
                                    AncestorType={x:Type UserControl},AncestorLevel=2},
                                    Path=DataContext.Prices}" DisplayMemberPath="DisplayMember" 
                                    SelectedValue="{Binding Price}" IsEditable="{Binding RelativeSource={RelativeSource FindAncestor, 
                                            AncestorType={x:Type UserControl}, AncestorLevel=2},
                                            Path=DataContext.IsComboBoxEditable, Mode=OneWay}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

私はViewModelに持っています

DataTable Price;
DataTable Prices;

Price には Name と Price の 2 つの列があり、 Price には DisplayMember と ValueMember の 2 つの列があります

ファイルから Precios を取得します。ファイルが読み込まれていない場合、表示する precies がないため、ファイルがないときにコンボボックスを編集可能にしました。そして、選択した値をユーザーが書いた値に設定するだけです

private void ComboBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    ComboBox comboBox = sender as ComboBox;
    if (comboBox.IsEditable)
    {
        comboBox.SelectedValue = (sender as ComboBox).Text;
    }
}

DataGridRow がブロックされるのはなぜですか?

4

0 に答える 0