2012-02-28 4 views
0

Я задал этот вопрос ранее и не получил ответа, но теперь у меня есть более подробная информация.Программно изменить отображение значка сортировки в заголовке столбца datagrid

В принципе, я хочу программно отобразить значок сортировки столбцов в столбце datagrid wpf.

У меня есть следующий код, чтобы сделать это:

private void dtgMain_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      dtgMain.Columns[0].SortDirection = ListSortDirection.Ascending; 
     } 

Это, кажется, установить порядок сортировки столбца, но когда сетка рисуется иконка не показывает.

Когда я добавляю окно сообщения в метод, он отлично работает. Мой вопрос двоякий. Почему окно сообщения заставляет метод работать? И как я могу заставить его работать без использования почтового ящика?

Это метод работы с MessageBox в нем:

private void dtgMain_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    MessageBox.Show("Here"); 
    dtgMain.Columns[0].SortDirection = ListSortDirection.Ascending; 
} 

редактировать Вот метод, который является установка DataContext в DataGrid

public void processLoad(string response) 
     { 
      XmlDataProvider provider = new XmlDataProvider(); 

      if (provider != null) 
      { 
       System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
       doc.LoadXml(response); 
       provider.Document = doc; 
       provider.XPath = "/moo/response/data/load/panel"; 
       dtgMain.DataContext = provider; 

      } 

     } 

Пожалуйста, дайте мне знать, если вам нужно больше информации.

+0

Я не могу воспроизвести описанное вами поведение. Когда я запускаю код, стрелка появляется вверх, независимо от того, отображается ли окно сообщения первым или нет. Можете ли вы предоставить информацию о том, что вызывает изменение DataContext для датадайда и когда это происходит? –

+0

Ok Bob сейчас загружается – user589195

ответ

3

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

Не могли бы вы попробуйте заменить строку, которая устанавливает направление сортировки с подобным вызовом поставить на диспетчерскую очереди:

dtgMain.Dispatcher.BeginInvoke(new Action(() => 
    { 
     dtgMain.Columns[0].SortDirection = ListSortDirection.Ascending; 
    }), DispatcherPriority.ApplicationIdle); 

и посмотреть, если это работает?

+0

Это то, что я думал, что происходит. Я попытался добавить код, который вы поставили, но получить «Невозможно преобразовать лямбда-выражение для ввода« System.Delegate », потому что это не тип делегата» на втором ( – user589195

+1

) А, извинения. Кажется, что вызов BeginInvoke ожидает тип делегата , а не просто простой лямбда.Я отредактировал код выше, так что посмотрим, работает ли он сейчас! –

+0

Блестящий. Проблема решена. Не могли бы вы дать краткое объяснение, почему это так себя ведет? Я предполагаю, что это задание порядка заголовка столбца , а затем после этого загрузите новый datacontext, который эффективно создает новые столбцы в datagrid? – user589195