3

ではWPF datagrid、セルが無効な場合、他のセルの編集が妨げられるため、ユーザーは無効なセルが有効になるまでデータを入力できません。この動作を無効にする方法があるのだろうか?

私が使用する方法がありますdatagrid

<DataGrid ItemsSource="{Binding ..}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Name"
         Binding="{Binding Name
         , UpdateSourceTrigger=PropertyChanged
         , NotifyOnValidationError=True
         , ValidatesOnDataErrors=True
         , ValidatesOnExceptions=True}"
    </DataGridTextColumn>
  </DataGrid.Columns>
</DataGrid>
4

2 に答える 2

1

datagrid以下のようなOnCanExecuteBeginEdit メソッドをオーバーライドしたところ、動作するようになりました。

  protected override void OnCanExecuteBeginEdit(System.Windows.Input.CanExecuteRoutedEventArgs e)
    {
        var hasCellValidationError = false;
        var hasRowValidationError = false;
        const BindingFlags bindingFlags =
            BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
        var cellError= this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags);
        var rowError = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags);

        if (cellError != null) 
            hasCellValidationError = (bool) cellErrorInfo.GetValue(this, null);
        if (rowError != null)
            hasRowValidationError = (bool) rowErrorInfo.GetValue(this, null);

        base.OnCanExecuteBeginEdit(e);
        if ((!e.CanExecute && hasCellValidationError) || (!e.CanExecute && hasRowValidationError))
        {
            e.CanExecute = true;
            e.Handled = true;
        }
    }

同じ質問: DataGrid: On cell validation error other row cells are uneditable/Readonly

于 2013-10-02T06:12:23.377 に答える
1

それが mvvm アプリケーションであり、この動作がアプリケーションで複数回繰り返される場合は、DataGridから継承する独自のものを作成し、次のようにメソッドDataGridをオーバーライドできます。OnCellEditEnding

public class myDataGrid : DataGrid
{
    protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e)
    {
        e.Cancel = true;
    }
}

そうでない場合は、次CellEditEndingのようにグリッドのイベントに登録することで同じことができます。

            mainGrid.CellEditEnding += (s, e) =>
                                       {
                                           e.Cancel = true;
                                       };
于 2013-09-15T09:43:21.513 に答える