powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF DataGrid сохранение SelectedItem
3 сообщений из 3, страница 1 из 1
WPF DataGrid сохранение SelectedItem
    #38967758
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Такая проблема у меня:
Есть на форме датагрид с детализацией:
Код: xml
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.
36.
37.
38.
39.
40.
41.
42.
43.
 <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Name}" Header="Продукт" Width="3*" Visibility="Visible"/>
                </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <ContentControl Style="{StaticResource CcBorderStyle}" >
                            <Grid Height="70" Width="Auto"
                                  
                                   Background="BlueViolet"
                                  
                                  HorizontalAlignment="Stretch"
                                  Style="{StaticResource GridGrayStyle}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <StackPanel Grid.Column="0">
                                    <TextBlock Text="Требуется"></TextBlock>
                                    <TextBlock Text="{Binding WeightOrder, StringFormat='0.###'}"></TextBlock>
                                </StackPanel>
                                <StackPanel Grid.Column="1">
                                    <TextBlock Text="Отправлено"></TextBlock>
                                    <TextBlock Text="{Binding WeightSend, StringFormat='0.###'}"></TextBlock>
                                </StackPanel>
                                <StackPanel Grid.Column="2">
                                    <TextBlock Text="Получено"></TextBlock>
                                    <TextBlock Text="{Binding WeightReceived, StringFormat='0.###'}"></TextBlock>
                                </StackPanel>
                                <StackPanel Grid.Column="3">
                                    <TextBlock Text="Упаковано"></TextBlock>
                                    <TextBlock Text="{Binding WeightPicking, StringFormat='0.###'}"></TextBlock>
                                </StackPanel>
                                <StackPanel Grid.Column="4">
                                    <TextBlock Text="Статус"></TextBlock>
                                    <TextBlock Text="{Binding Id_Status}"></TextBlock>
                                </StackPanel>
                            </Grid>
                        </ContentControl>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>



Он привязан к следующим полям:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        public ObservableCollection<p_ShowPickingMeatOrderDetailsResult> OrderDetails { get { return m_order_details_.OrderDetails; } }
        public p_ShowPickingMeatOrderDetailsResult CurrentDetail
        {
            get { return m_order_details_.CurrentDetail; }
            set
            {
                m_order_details_.CurrentDetail = value;
                RaisePropertyChanged("CurrentDetail");
                RaisePropertyChanged("CurrentDetail.Id_Status");
            }
        }



m_order_details_ - модель, вот её код:
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
   class M_OrderDetails : ViewModelBase
    {
        private p_ShowPickingMeatOrdersResult _current_order;

        public p_ShowPickingMeatOrdersResult CurrentOrder
        {
            get
            {
                return _current_order;
            }
            set
            {
                _current_order = value;
                RaisePropertyChanged("CurrentOrder");
            }
        }

        public M_OrderDetails(p_ShowPickingMeatOrdersResult _currentOrder)
        {
            CurrentOrder = _currentOrder;
            using (DCZnam dc = new DCZnam(Terminal.SqlConnection))
            {
                order_details_ = new ObservableCollection<p_ShowPickingMeatOrderDetailsResult>(dc.p_ShowPickingMeatOrderDetails(_currentOrder.Id, null).ToList());
            }
        }

        private object locker = new object();
        public void RefreshDetails()
        {
            lock (locker)
            {
                p_ShowPickingMeatOrderDetailsResult _cur = CurrentDetail;
                using (DCZnam dc = new DCZnam(Terminal.SqlConnection))
                {
                    order_details_ = new ObservableCollection<p_ShowPickingMeatOrderDetailsResult>(dc.p_ShowPickingMeatOrderDetails(CurrentOrder.Id, null).ToList());
                }

                CurrentDetail = OrderDetails.FirstOrDefault(t => t.id_PickingMeatOrderDetails == _cur.id_PickingMeatOrderDetails);

                RaisePropertyChanged("OrderDetails");
                RaisePropertyChanged("CurrentDetail");
            }
        }

        private ObservableCollection<p_ShowPickingMeatOrderDetailsResult> order_details_;
        public ObservableCollection<p_ShowPickingMeatOrderDetailsResult> OrderDetails
        {
            get
            {
                return order_details_;
            }
        }
        private p_ShowPickingMeatOrderDetailsResult _currentDetail;
        public p_ShowPickingMeatOrderDetailsResult CurrentDetail
        {
            get { return _currentDetail; }
            set
            {
                if (value != null)
                    _currentDetail = value;
                RaisePropertyChanged("CurrentDetail");
            }
        }
    }

...
Рейтинг: 0 / 0
WPF DataGrid сохранение SelectedItem
    #38967770
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
продолжение (случайно ткнул в опубликовать вместо предпросмотра):

При загрузке формы у меня происходит вызов метода GetData
Код: c#
1.
2.
3.
4.
        private void GetData()
        {
            _currentOrder = ServiceLocator.Current.GetInstance<VM_OrdersList>().CurrentOrder;
            m_order_details_ = new M_OrderDetails(_currentOrder);



На форме висит таймер, который делает :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        private void RefreshTimerOnElapsed(object _sender, ElapsedEventArgs _elapsed_event_args)
        {
            p_ShowPickingMeatOrderDetailsResult _cur = CurrentDetail;
            m_order_details_.RefreshDetails();
            m_order_details_.CurrentDetail = _cur;
            RaisePropertyChanged("OrderDetails");
            RaisePropertyChanged("CurrentDetail");
        }



При срабатывании таймера, выделенная строка прыгает на первую!
Я уже пытаюсь сохранить CurrentOrder везде где можно, но никак не выходит!

Подскажите как это побороть, пожалуйста?
...
Рейтинг: 0 / 0
WPF DataGrid сохранение SelectedItem
    #38968471
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил такое поведение:
Если обновление данных повесить на кнопку, то перескока строки не происходит.
Если на таймере - строка перескакивает на первую при обновлении.
Код один и тот же.
Если под дебаггером посмотреть, то можно увидеть, что попадаем в один и тот же код с разных потоков, порождённых таймером.
Отключение таймера в начале обновления данных и его включение в конце также не решает проблему.
lock так же не спасает
попытался вынести переменную в которую сохраняю текущую позицию вне метода обновления - не помогло!

Помогло сделать Invoke в главный поток. Строка при таком раскладе не перескакивает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        private void RefreshTimerOnElapsed(object _sender, ElapsedEventArgs _elapsed_event_args)
        {
            //return;
            lock (locker)
            {
                Application.Current.Dispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.Normal,
    new Action(
        delegate()
        {
            refresh_timer.Stop();
            p_ShowPickingMeatOrderDetailsResult _cur = CurrentDetail;
            m_order_details_.RefreshDetails();
            RaisePropertyChanged("OrderDetails");
            CurrentDetail = OrderDetails.FirstOrDefault(t => t.id_PickingMeatOrderDetails == _cur.id_PickingMeatOrderDetails);
            RaisePropertyChanged("CurrentDetail");
            refresh_timer.Start();
        }
        ));
            }
        }



Так и не смого выяснить почему так происходит...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF DataGrid сохранение SelectedItem
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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