2

私は WPF プロジェクトに取り組んでおり、現在、DataGrid. そのため、無効なデータが挿入された場合は、通知イメージを に表示しRowHeaderます。これまでのところ、すべてがうまくいっています。

しかし、私の質問は: DataGrid の現在の行を除いて、「無効な」データが挿入されたときにアプリケーション内の他のコントロールをブロックする方法はありますか?? または、正しいデータが入力されるまで現在の行がフォーカスを失うのを防ぐにはどうすればよいですか??

eventAggregatorこれまでのところ、私の考えは、エラーについてすべてのコントロールに通知するために使用してイベントを発生させることです。しかし、私が持つことができる各コントロールでメソッドをサブスクライブする必要があるため、これは困難です。

誰かが私を助けてくれることを願っています、事前に感謝します。

4

1 に答える 1

1

CellEditEnding イベントをキャンセルすることで、セルがフォーカスを失うのを防ぎます。

public MainWindow()
{
    InitializeComponent();

    dataGrid1.ItemsSource = new List<TestClass>() { new TestClass() };
    dataGrid1.CellEditEnding += new EventHandler<DataGridCellEditEndingEventArgs>(dataGrid1_CellEditEnding);
}

void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if(whateveryouwant == true)
        return;
     else    
    e.Cancel = true;
}

編集:

EventAggregator はそれを解決するための良い方法ですが、それはわかっていても気に入らないように思われるので、より簡単な方法は次のとおりですが、停止できるコントロールの種類をいくつか指定する必要があります。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        dataGrid1.ItemsSource = new List<TestClass>() { new TestClass() };
        dataGrid1.CellEditEnding += new EventHandler<DataGridCellEditEndingEventArgs>(dataGrid1_CellEditEnding);

        MouseDownHandler = new MouseButtonEventHandler((sender, args) => { args.Handled = true; });
        MouseClickHandler = new RoutedEventHandler((sender, args) => { args.Handled = true; });
    }

    private bool IsMouseEventStopped = false;
    private RoutedEventHandler MouseClickHandler = null;
    private MouseButtonEventHandler MouseDownHandler = null;

    void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        bool correctCellValue = false;

        //correctCellValue = true to stop editing, if the cell value is correct


        if (correctCellValue)
        {
            // unblock mouse events
            if (IsMouseEventStopped == true)
            {
                foreach (Button c in FindVisualChildren<Button>(this))
                    c.Click -= MouseClickHandler;
                foreach (TextBox c in FindVisualChildren<TextBox>(this))
                    c.PreviewMouseLeftButtonDown -= MouseDownHandler;
            }
            IsMouseEventStopped = false;
        }
        else
        {
            e.Cancel = true;
            // block mouse events to certain controls
            if (IsMouseEventStopped == false)
            {
                IsMouseEventStopped = true;
                foreach (Button c in FindVisualChildren<Button>(this))
                    c.Click += MouseClickHandler;
                foreach (TextBox c in FindVisualChildren<TextBox>(this))
                    c.PreviewMouseLeftButtonDown += MouseDownHandler;
            }
        }
    }

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                    yield return (T)child;

                foreach (T childOfChild in FindVisualChildren<T>(child))
                    yield return childOfChild;
            }
        }
    }
}

ここからFindVisualChildrenを提供してくれたBryce Kahleに感謝します

于 2012-07-07T23:50:23.973 に答える