我有一个已绑定到属性的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执行此操作的若干建议,但它们的范围从完全邪恶到简单的难看:
在Silverlight 4.0中是否有一种惯用的,优雅的方式来做我想要的事情?
答案 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">