2010-09-22 2 views
1

У меня есть DataGrid, что я привязан к свойству:Событие «Объединение данных» для Silverlight 4.0 DataGrid?

<cd:DataGrid 
    Name="myDataGrid" 
    ItemsSource="{Binding Mode=OneWay,Path=Thingies}" 
    VerticalScrollBarVisibility="Auto" 
    HorizontalScrollBarVisibility="Auto"> 
... 

Когда Thingies изменения свойств, сразу все строки в DataGrid были заполнены новым содержаниемThingies, я хочу DataGrid к прокрутите до нижней строки.

В WinForms я сделал бы это, подписавшись на событие DataBindingComplete. MSDN Форум содержит несколько предложений о том, как сделать это с помощью Silverlight 4.0, но они варьируются от полного зла просто Fugly:

  • запуска таймера 100 мс на нагрузку, и прокручивать, когда он истекает
  • подсчета строк, как они» re добавлено и прокручивается вниз, когда количество добавленных строк равно количеству объектов в источнике данных

Есть ли идиоматический, элегантный способ сделать то, что я хочу в Silverlight 4.0?

ответ

1

Почему бы не проиллюстрировать DataGrid и просто создать свой собственный ItemsSourceChanged событие?

 public class DataGridExtended : DataGrid 
     { 
      public delegate void ItemsSourceChangedHandler(object sender, EventArgs e); 

      public event ItemsSourceChangedHandler ItemSourceChanged; 

      public new System.Collections.IEnumerable ItemsSource 
      { 
       get { return base.ItemsSource; } 
       set 
       { 
        base.ItemsSource = value; 

        EventArgs e = new EventArgs(); 
        OnItemsSourceChanged(e); 
       } 
      } 

      protected virtual void OnItemsSourceChanged(EventArgs e) 
      { 
       if (ItemSourceChanged != null) 
        ItemSourceChanged(this, e); 
      } 
     } 
+0

Приятная идея, но мне нужно знать, когда привязка завершена, т. Е. Когда столько связанных элементов было отображено в сетке, насколько это возможно. Вероятно, событие ItemSourceChanged будет запущено до завершения рендеринга. –

+0

@ Duncan Вы уже использовали событие LayoutUpdated и отметили, когда это срабатывает? Это может привести к потере рендеринга изменения ItemsSource, который обеспечит необходимый вам крючок. –

0

Используйте способ ScrollIntoView для достижения этого.

myDataGrid.ItemSource = Thingies; 
myDataGrid.UpdateLayout(); 
myDataGrid.ScrollIntoView(MyObservableCollection[MyObservableCollection.Count - 1], myDataGrid.Columns[1]); 

Для этого не требуется специальное мероприятие.

+0

Хариш, я понимаю, что установка ItemSource приводит к тому, что привязка происходит асинхронно. Это означает, что в примере кода, который вы предоставили, ScrollIntoView() может быть вызван до того, как последний объект в коллекции был связан. Вот почему мне нужно событие, чтобы указать, что привязка завершена. –

+0

Попробуйте поместить свой оператор привязки данных в оператор try catch. И вне этого, попросите ваше заявление прокрутить до последней записи. – Harish

2

Я наткнулся на это, ища решение по той же проблеме. Я обнаружил, что когда я попытался прокрутить выбранный элемент в поле зрения после фильтров и изменений сортировки, я часто получал ошибку времени выполнения (индекс за пределами границ). Я инстинктивно знал, что это потому, что сетка не была заселена в этот конкретный момент.

Предложение Аарона работало для меня. Когда сетка определяется, добавить слушатель события:

_TheGrid.LayoutUpdated += (sender, args) => TheGrid.ScrollIntoView(TheGrid.SelectedItem, TheGrid.CurrentColumn); 

Это решило мою проблему, и, кажется, тихо выйти, когда параметры равны нулю, тоже.

0

Я думаю, что хороший способ сделать это, в xaml, должен иметь привязку NotifyOnTargetUpdated=true, а затем вы можете подключить TargetUpdated к любому событию по вашему выбору.

<ThisControl BindedProperty="{Binding xxx, NotifyOnTargetUpdated=true}" 
      TargetUpdated="BindingEndedHandler"> 
+0

Кажется, что для WPF, а не для Silverlight? –

Смежные вопросы