Silverlight 4.0 DataGrid的“数据绑定完成”事件?

时间:2010-09-22 06:37:08

标签: data-binding 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执行此操作的若干建议,但它们的范围从完全邪恶到简单的难看:

  • 在加载时启动100ms计时器,并在其过去时滚动
  • 计算添加的行数,并在添加的行数等于数据源中的实体数时滚动到底部

在Silverlight 4.0中是否有一种惯用的,优雅的方式来做我想要的事情?

4 个答案:

答案 0 :(得分:2)

我在寻找同样问题的解决方案时偶然发现了这一点。我发现当我尝试在筛选和排序更改后将所选项目滚动到视图中时,我经常收到运行时错误(索引超出范围)。我本能地知道这是因为网格没有在那个特定时刻填充。

亚伦的建议对我有用。定义网格后,我添加一个事件监听器:

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

这解决了我的问题,并且当参数为空时似乎默默地退出。

答案 1 :(得分: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);
           }
       }

答案 2 :(得分:0)

使用ScrollIntoView方法实现此目的。

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

您无需为此举办任何特别活动。

答案 3 :(得分:0)

我认为在xaml中执行此操作的好方法是使用绑定NotifyOnTargetUpdated=true,然后您可以将TargetUpdated挂钩到您选择的任何事件。

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