Событие «Связывание данных завершено» для Silverlight 4.0 DataGrid? - PullRequest
1 голос
/ 22 сентября 2010

У меня есть 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, но они варьируются от абсолютно злых до просто неаккуратных:

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

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

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

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

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

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

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

1 голос
/ 22 февраля 2011

Почему бы не извлечь из 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 голосов
/ 25 октября 2011

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

<ThisControl BindedProperty="{Binding xxx, NotifyOnTargetUpdated=true}"
             TargetUpdated="BindingEndedHandler">
0 голосов
/ 17 февраля 2011

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

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

Вам не нужно иметь никакого специального события для этого.

...