Привязка Windows Forms: есть ли событие, подобное DataBindingComplete, но сработало, когда ВСЕ привязки завершены? - PullRequest
1 голос
/ 03 июня 2011

Мне нужно изменить определенное свойство DataGridView (DataSourceUpdateMode для одной из его привязок), только когда ВСЕ его начальные привязки данных завершены.

Я попытался подписаться на событие «DataBindingComplete», но оно сработалослишком много раз (один или несколько раз для каждой привязки, связанной с контролем);мне нужно более глобальное событие «AllDataBindingsComplete», которое запускается, когда элемент управления готов для отображения пользователю.

В качестве временного обходного пути я использую событие MouseDown (я предположил, что когдапользователь может щелкнуть элемент управления, это означает, что элемент управления отображается ... :) и события, с которыми я играю - SelectionChanged - запускаются после MouseDown):

    protected override void OnMouseDown(MouseEventArgs e)
    {
        Binding selectedItemsBinding = this.DataBindings["SelectedItems"];
        if (selectedItemsBinding != null)
        {
            selectedItemsBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
        }

        base.OnMouseDown(e);
    }

Это работает, но пахнет как уродливый хак много (и он вызывается слишком много раз, только одного раза достаточно для моих нужд).

Есть ли лучший способ?

(да, япытаюсь применить MVVM в проекте Windows Forms, и я добавил привязываемое свойство SelectedItems к DataGridView ...)

1 Ответ

4 голосов
/ 03 июня 2011

То, что я сделал на уровне Windows Forms форма и может быть импровизировано вплоть до того элемента управления, который вам нужен, - это создание подкласса базового класса Windows Forms в мой собственный. Затем в конструкторе присоедините дополнительный вызов события к событию Load().

Поэтому, когда все иначе является полностью загруженным , только ТОГДА он попадет в мой пользовательский метод (из подкласса). Поскольку она является нижней частью цепочки стеков вызовов, прикрепленной к очереди событий, я знаю, что она последняя и все остальное сделано ... Вот фрагмент концепции.

public class MyForm : Form
{
    public MyForm()
    {
        this.Load += AfterEverythingElseLoaded;
    }

    private void AfterEverythingElseLoaded(object sender, EventArgs e)
    {
        // Do my own things here...
    }
}

Эту концепцию можно применить и к функции Init(), если она более подходит для вашего элемента управления ... Пусть все остальное внутри нее инициализируется (), а затем вам функция "AfterInitialized ()".

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