gpt4 book ai didi

c# - 如何滚动到 wpf mvvm 中数据网格中新添加的行

转载 作者:行者123 更新时间:2023-11-30 22:01:40 25 4
gpt4 key购买 nike

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

最佳答案

您需要执行以下操作:

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

  2. 将委托(delegate)添加到您的 View 模型以供 AddRow 函数调用 - 委托(delegate)应将您要滚动到 View 中的对象作为参数。

  3. 让包含数据网格的后台代码订阅委托(delegate) ==> 基本上后台代码提供对 View 模型的回调。回调背后的代码将是滚动到新项目的代码。

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

  5. 在 View 模型的 Add Row 函数结束时(在添加项目之后)调用带有要滚动到 View 中的项目的委托(delegate)。

示例代码:

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

关于c# - 如何滚动到 wpf mvvm 中数据网格中新添加的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27519168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com