如何在wpf mvvm中滚动到datagrid中新添加的行

时间:2014-12-17 05:53:55

标签: c# wpf mvvm datagrid observablecollection

我有一个绑定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++);
}

2 个答案:

答案 0 :(得分:3)

您需要执行以下操作:

  1. 为您的dataGrid命名,以便您可以在代码隐藏文件中访问它(与包含您的数据网格的xaml文件配对的.cs文件)

  2. 将一个委托添加到您的视图模型以供AddRow函数调用 - 委托应该将您想要滚动到视图中的对象作为参数。

  3. 让包含数据网格的代码订阅委托==&gt;基本上,后面的代码是为您的视图模型提供回调。回调后面的代码将是滚动到新项目的代码。

  4. 回调应该调用数据网格的ScrollIntoView函数(http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.scrollintoview(v=vs.110).aspx

  5. 在视图模型的“添加行”功能结束时(添加项目后),调用具有要滚动到视图中的项目的委托。

  6. 示例代码:

    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);

此行将滚动到当前添加的元素。