2008-11-18 6 views
4

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

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

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

Благодаря Майк

ответ

0

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

1

Майк,

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

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

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

Я надеюсь, что это помогает,

Спасибо,

Скотт

3

Вы пробовали настройки логическое поле (напр. BOOL dataGridFirstLoad), который вы установили в ложна в конструкторе вашего управления пользователя.

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

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

0

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

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... 
      } 
     } 
1

это похоже на вышеуказанные должности (и хэш из предложения Пауло T,). Это хорошо работает. // установить SelectionChanged обработчик в 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; 
    } 
}