powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление/перерисовка DataGrid
14 сообщений из 14, страница 1 из 1
Обновление/перерисовка DataGrid
    #38085671
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все доброго времени суток!
Как обновить/перерисовать DataGrid, привязанный к ObservableCollection<T> в MVVM?
например: в методе ViewModel'и в цикле добавляются 100 записей в коллекцию. DataGrid обновиться после добавления всех записей, а хочется, чтоб после каждого добавления записи в коллекцию изменения тут же отображались в DataGrid'е.
Пробовал привязать DataGrid к ICollectionView и после каждого добавления записи в коллекцию вызывать ICollectionView.Refresh() - не помогает.
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38085720
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicky_Nв цикле добавляются 100 записей в коллекцию. DataGrid обновиться после добавления всех записей, а хочется, чтоб после каждого добавления записи в коллекцию изменения тут же отображались в DataGrid'е
)))
изменения отображаются, просто отображение - дело небыстрое... попробуйте добавлять помедленней
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += (s, e) => {
collection.Add(...);
};
timer.Start();
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38085740
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

После каждого добавления поставил задержку:
Код: c#
1.
2.
3.
4.
5.
for (int i = 0; i < 10; i++)
{
     Collection.Add(...);
     System.Threading.Thread.Sleep(2000);
}


все равно показывает только после добавления всех записей.
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38085764
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicky_N,

не, так не годится, так же "примораживается" UI-поток, цепляйтесь к таймеру (проще к System.Windows.Threading.DispatcherTimer) или же добавляйте не в UI-потоке
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38085779
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, работающий код (с успевающей отрисовкой)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
...
    using System.Collections.ObjectModel;
    using System.Windows.Threading;
...
     public partial class Home : Page
    {
        DispatcherTimer _timer = new DispatcherTimer();
        ObservableCollection<string> _collection = new ObservableCollection<string>();
        public Home()
        {
            InitializeComponent();

            _timer.Interval = TimeSpan.FromMilliseconds(100);
            _timer.Tick += (s, e) => {
                _collection.Add(Guid.NewGuid().ToString());
            };
            this.Loaded += (s, e) => {
                this.DG.ItemsSource = _collection;
                _timer.Start();
            };
        }
...
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38085785
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

с таймером пошло отлично! спасибо!!!
с потоками поиграть попробую...
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38086717
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поигрался с фишкой .Net 4.0 - Task
Код: c#
1.
2.
3.
4.
5.
Task task = new Task(() =>
{
      Метод, обновляющий данные
});
task.Start();


Только вот беда: нельзя обновлять ObservableCollection<T>, к которому прикручен UI Control, из другого потока. Решение нашлось - AsyncObservableCollection<T> .
Все получилось.
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38086872
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicky_NТолько вот беда: нельзя обновлять ObservableCollection<T>, к которому прикручен UI Control, из другого потока.
не знаю какую задачу Вы решаете, но в обсуждаемом примере можно сделать и так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            ThreadPool.QueueUserWorkItem((o) => {
                for (int i = 1; i <= 100; i++) {
                    this.Dispatcher.BeginInvoke(() => _collection.Add("item " + i.ToString()));
                    Thread.Sleep(100);
                }
            });
        }


т.е. добавление - в UI-потоке, цикл с задержкой - в другом
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38086907
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

1) обновление коллекции из ViewModel.
2) головное приложение - WinForms, View - WPF UserControl, которое хостится в System.Windows.Forms.Integration.ElementHost, поэтому непонятно как добраться до Dispatcher.
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38087235
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicky_NView - WPF UserControl, которое хостится в System.Windows.Forms.Integration.ElementHost, поэтому непонятно как добраться до Dispatcher.
а ElementHost.Invoke пробовали?
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38087246
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,
загружаю так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
        private System.Windows.Forms.Integration.ElementHost hostWpfControl;

        private void MAIN_FORM_Load(object sender, EventArgs e)
        {
            hostWpfControl = new System.Windows.Forms.Integration.ElementHost();
            hostWpfControl.Dock = DockStyle.Fill;
            hostWpfControl.Parent = this;

            DesReportViewModel viewModel = new DesReportViewModel();

            DesReportView _desReportView = new DesReportView();

            // Когда ViewModel посылает запрос на закрытие - закрыть окно
            EventHandler handler = null;
            handler = delegate
            {
                viewModel.RequestClose -= handler;
                this.Close();
            };

            viewModel.RequestClose += handler;

            _desReportView.DataContext = viewModel;

            viewModel.ReportDate = DateTime.Today.Date;

            try
            {
                hostWpfControl.Child = _desReportView;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }



В констуркторе DesReportViewModel создается еще одна ViewModel, которая и обновляет коллекцию. Как в этой ViewModel добраться до ElementHost ? передавать с помощью конструкторов DesReportViewModel(ElementHost), ViewModel(ElementHost)?
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38087253
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicky_N,

ну не знаю... тут Вам виднее как лучше...
(я бы Integration.ElementHost вообще не использовал, помнится, там проблем предостаточно, утечки памяти и т.п., в чем необходимость скрещивать винформы и впф?)
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38087272
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

да я понимаю - как говорится, не от хорошей жизни)))
дело в том, что проект изначально на WinForms, а хочется уже пробовать WPF, поэтому и приходится изголяться...
...
Рейтинг: 0 / 0
Обновление/перерисовка DataGrid
    #38090484
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел еще одно решение, без использования AsyncObservableCollection<T> - добавить статический класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public static class DispatchService
    {
        public static Dispatcher DispatchObject { get; set; }

        public static void Dispatch(Action action)
        {
            if (DispatchObject == null || DispatchObject.CheckAccess())
            {
                action();
            }
            else
            {
                DispatchObject.Invoke(action);
            }
        }
    }


в конструктор View:
Код: c#
1.
2.
3.
4.
    {
        InitializeComponent();
        DispatchService.DispatchObject = this.Dispatcher;
    }


доавление элементов в коллекцию из ViewModel:
Код: c#
1.
2.
3.
4.
            DispatchService.Dispatch(() =>
            {
                Collection.Add(...);
            });
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление/перерисовка DataGrid
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]