Автоматический выбор Silverlight DataGrid при настройке ItemSource / DataContext, сортировке, - PullRequest
4 голосов
/ 18 ноября 2008

Есть ли способ отключить автоматический выбор первой строки во встроенной DataGrid в Silverlight?

Мы создаем множество функций, основанных на выборе пользователем строки в сетке данных. Автоматическое срабатывание SelectionChanged при привязке данных или сортировке действительно вызывает у нас проблемы. Мы пытались поставить несколько охранников вокруг выбора, но, похоже, не удалось решить все проблемы.

Например, если у вас есть DataGrid на вкладке TabControl, которая не отображается при загрузке экрана, а DataGrid имеет привязку к свойству DataContext, которое представляет собой список объектов. Сетка не привязана к данным, пока не отобразится вкладка. Есть ли событие, сообщающее нам, что сетка привязана к данным? Разве поведение привязки данных по умолчанию не должно выбирать строку?

Спасибо Mike

Ответы [ 5 ]

3 голосов
/ 22 ноября 2008

Вы пытались установить логическое поле (например, bool dataGridFirstLoad), которое вы установили в false в конструкторе пользовательского элемента управления.

Затем в событии SelectionChanged объекта DataGrid проверьте, имеет ли dataGridFirstLoad значение false. Если для false установлено значение true и для SelectedItem задано значение null.

Надеюсь, это поможет.

1 голос
/ 13 февраля 2009

это похоже на посты выше (и выдвигает предложение Пауло Т). Это хорошо работает. // устанавливаем обработчик selectionchange в xaml или в конструктор // У меня есть 2 сетки на моей странице, поэтому я создаю одно логическое свойство для каждого

private bool IsFirstLoad { get; set; }
private bool IsFirstLoadDetails { get; set; }
public BookDisplay()
{
  //code here
  this.IsFirstLoad = true;
  this.IsFirstLoadDetails = true;
  BindBooks(); //define this function (not in this snippet for the sake of brevity)
}
private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoad)
  {
    GridBooks.SelectedItem = -1;
    this.IsFirstLoad = false;
  }
  else
  {
    //do your stuff
  }
}
private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoadDetails)
  {
     GridBooksWithDetails.SelectedItem = -1;
     this.IsFirstLoadDetails = false;
  }
}
1 голос
/ 19 ноября 2008

Майк,

Я решил эту проблему, обернув элемент управления Windows и отловив событие изменения выбора в сетке обернутых окон.

В вашем элементе управления подключите событие Loaded вашего элемента управления, и, когда оно загружено, задайте для логической переменной закрытого члена значение true. Затем, когда вы ловите событие изменения выбора внутренней сетки данных, поднимайте только свое собственное событие изменения выбора, если вы управляете загрузкой. Когда это будет сделано, теперь вы можете вернуться к подпункту OnApplyTemplate и установить выбранный индекс вашей внутренней сетки данных на -1, а на выбранный элемент - ничего. Так как настройка индекса и элемента произойдет до того, как ваш элемент управления завершит загрузку, событие изменения выбора не сработает. Я пробовал это в среде с вкладками и без вкладок, и, кажется, работает без проблем. Теперь перейдем к более сложной проблеме. Возможно, вы заметили, что при сортировке сетки данных Windows (в то время как данные привязаны к ItemsSource) она всегда выбирает верхний элемент отображаемых данных. Это, конечно, вызовет событие выбора, измененного, и переместится к элементу, который ранее не был выбран, и, насколько я вижу, не должен быть выбран. Чтобы справиться с этим, вам придется сделать немного более сложное кодирование. Если вы заметили, что когда вы ловите событие изменения выбора внутренней сетки и смотрите на выбранный элемент, есть только несколько случаев, когда для выбранного элемента ничего не установлено, например, когда элемент больше не выбран (т.е. выбор отменен), или когда (СОВЕТ) столбцы сортируются. При сортировке запускаются два события: первое - это отмена выбора элемента (SelectedItem - Nothing), а второе - выбор верхнего элемента в списке (SelectedIndex 0). Теперь, если вы должны были установить флаг в обработчике события для изменения выбора внутренних сеток и поймать тот факт, что элемент является ничем, вы можете отслеживать предыдущий выбранный элемент, а затем установить выбранный элемент внутренней сетки данных на ранее выбранный элемент.

Это решает проблему прилично, и, как всегда, могут быть нежелательные результаты при переносе элемента управления Windows, но, насколько я могу судить, это единственный способ обойти первый ряд, выбранный при проблеме загрузки. , Однако я могу только представить, что это будет исправлено M $ в какой-то момент.

Надеюсь, это поможет,

Спасибо,

Scott

0 голосов
/ 04 февраля 2010

Так как код для DataGrid был доступен от Microsoft, мы удалили выделение, поэтому нам не пришлось обходить его. Я считаю, что это больше не проблема с сеткой Silverlight 3.0.

0 голосов
/ 05 января 2009

Код ниже должен сделать это (установите JustRefreshed на true при каждом обновлении / обновлении сетки):

 int LastSelectedIndex = -1;
 bool JustRefreshed = false;

        private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (JustRefreshed)
            {
                JustRefreshed = false;
                dataGrid.SelectedIndex = LastSelectedIndex;
                return;
            }
            if (e.AddedItems.Count > 0)
            {
                LastSelectedIndex = dataGrid.SelectedIndex;
                        }    
                //Your logic comes here...
            }
        }
...