我有一个绑定Observable Collection的数据网格。当我点击添加新按钮时,我将添加新行到集合。如何以实用方式滚动到新行。
数据网格XMAL
<DataGrid SelectedIndex="{Binding SelectedIntex}" IsEnabled="{Binding IsKeySet}" CanUserDeleteRows="False" CanUserAddRows="False" Name="dgwTemplateDetails" SelectionMode="Single" ItemsSource="{Binding OrderTemplateList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedOrderTemplate}" IsReadOnly="False" AutoGenerateColumns="False" Width="auto">
<DataGrid.Columns>
<DataGridTextColumn Header="Srl No" Visibility="Hidden" Binding="{Binding SrlNo}"/>
<DataGridTextColumn Header="Act Code" Width="75" Binding="{Binding ActCode, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Act Name" Width="275" Binding="{Binding ActName, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="No. Of Days" Width="75" Binding="{Binding NoOfDays, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridCheckBoxColumn Header="Is Cutting" Width="75" Binding="{Binding IsCutSelected, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>
</DataGrid>
VM添加行功能
if (ValidateHeader())
{
if (OrderTemplateList == null)
this.OrderTemplateList = new ObservableCollection<EventManagementTemplate>();
EventManagementTemplate obJEvent = new EventManagementTemplate();
obJEvent.BuyerCode = this.BuyerCode;
this.OrderTemplateList.Add(obJEvent);
int no = 1;
this.OrderTemplateList.ToList().ForEach(m => m.SrlNo = no++);
}
答案 0 :(得分:3)
您需要执行以下操作:
为您的dataGrid命名,以便您可以在代码隐藏文件中访问它(与包含您的数据网格的xaml文件配对的.cs文件)
将一个委托添加到您的视图模型以供AddRow函数调用 - 委托应该将您想要滚动到视图中的对象作为参数。
让包含数据网格的代码订阅委托==&gt;基本上,后面的代码是为您的视图模型提供回调。回调后面的代码将是滚动到新项目的代码。
回调应该调用数据网格的ScrollIntoView函数(http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.scrollintoview(v=vs.110).aspx)
在视图模型的“添加行”功能结束时(添加项目后),调用具有要滚动到视图中的项目的委托。
示例代码:
public class MyViewModel
{
// declare the delegate signature...
delegate void ScrollIntoViewDelegateSignature(EventManagementTemplate objEvent);
// create a pointer to the delegate that can be set by the code behind...
public ScrollIntoViewDelegateSignature ScrollIntoView {get; set;}
protected AddRow()
{
.. your code here
// call the delegate...
if (ScrollIntoView != null)
ScrollIntoView(objEvent)
}
}
public class MyControlOrWindowThatContainsDataGrid : UserControl/ChildWindow/Page
{
public void Initialize()
{
...your code here
// set the scrollIntoView delegate...
myViewModel.ScrollIntoView = ScrollIntoView;
}
// create a ScrollIntoView function
// ==> the return value and parameters MUST match the delegate signature
public void ScrollIntoView(EventManagementTemplate objEvent)
{
myDataGrid.ScrollIntoView(objEvent);
}
}
参考 http://msdn.microsoft.com/en-us/library/900fyy8e.aspx
在我看来,最好是使用一个事件做到这一点,但这更复杂。 以下是有关如何使用事件的msdn文档:http://msdn.microsoft.com/en-us/library/awbftdfh.aspx
答案 1 :(得分:0)
在DataGrid中添加项目后尝试此操作:
dgwTemplateDetails.ScrollIntoView(obJEvent);
此行将滚动到当前添加的元素。