Где находится событие WPF DataGrid DataBindingComplete? - PullRequest
5 голосов
/ 01 октября 2010

Мне нужно предпринять некоторые действия (например, сделать некоторые ячейки доступными только для чтения на основе некоторых других ячеек) после завершения привязки данных. В WinForm DataGridView я делал это в событии DataBindingComplete. Однако я не смог найти такое событие в WPF DataGrid. Что еще я могу использовать?

Ответы [ 6 ]

6 голосов
/ 25 октября 2010

Вот что я понял: событие DataContextChanged - правильное событие для использования. Единственная проблема заключается в том, что сетка данных не совсем готова для использования в моем коде внутри этого события. Тем не менее, он работает нормально, если я использую Dispatcher.BeginInvoke, как это:

Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => DoSomethingWithGrid()));

Кто-нибудь может объяснить, почему это необходимо?

На самом деле, когда я имел дело с WPF DataGrid, мне пришлось использовать Dispatcher во многих случаях, чтобы он работал. Почему?

1 голос
/ 09 июня 2017

Я хотел покрасить свои строки в зависимости от значений их свойств, и я перепробовал много событий (DataGrid.Initialized, DataContextChanged, AddingNewItem, RowLoaded и т. Д.) Наряду с вещью BeginInvoke, но ничего не получалось. Тогда я нашел:

Loaded

Это событие сработало, так как оно позволило мне перебирать строки и раскрашивать их, как я хотел.

private void SubjectsList_Loaded(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => ColorMyRows()));
}

CollorMyRows выглядит очень похоже на их:

private void ColorMyRows()
{
    DataGridRow row = null;
    for (int i = 0; i < SubjectsList.Items.Count; i++)
    {
        // get one row
        row = SubjectsList.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
        if (myConditionIsFulfilled)
        {
            row.Background = Brushes.PaleGoldenrod; // black'n gold baby
            row.ToolTip = "This item fulfills the condition.";
        }
        else
        {
            row.Background = Brushes.PaleGreen;
            row.ToolTip = "This item does not.";
        }
    }
}

Примечание : Если у вас ObservableCollection, связанный с DataGrid, индекс в цикле (индекс строки DataGrid) будет соответствовать индексу в коллекции: )

1 голос
/ 17 сентября 2012

Возможно, вы используете потоки, а сетка данных не является поточно-ориентированной, как все компоненты пользовательского интерфейса.

1 голос
/ 01 октября 2010

DataContextChanged.

0 голосов
/ 20 апреля 2016

Вы можете объявить BackgroundWorker и попытаться заполнить свой GridView в событии DoWork и написать свой код в событии RunWorkerCompleted

0 голосов
/ 27 сентября 2012

Вы можете привязать свойство «Только чтение ячеек» к свойству, которое изменяется при изменении других свойств модели.Некоторое время назад я думал точно так же, как и вы, но я начал больше думать о модели, чем о представлении, которое меня не интересует, но в списке, который ограничен, вы можете сделать то же, что и раньше, в аналогичной ситуации1001 *

public class Model : INotifyPropertyChanged
    {
public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                isChecked = value;
                RaisePropertyChanged("IsChecked");
                RaisePropertyChanged("Visibilty");
            }
        }
public Visibility Visibilty
        {
            get
            {
                return IsChecked ? Visibility.Visible : Visibility.Hidden;
            }
        }
}

это был флажок в сетке данных, привязанный к свойству IsChecked и другим ячейкам, привязанным к видимости, и он работал для меня.надеюсь, это поможет вам.

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