繁体   English   中英

ScrollIntoView不会滚动到DataGrid中的SelectedItem

ScrollIntoView Does Not Scroll To SelectedItem in DataGrid

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用模型来选择DataGrid中的项目,如下所示:

public ObservableCollection<MyModel> Models{
   get {return m_Models; }
}

public MyModel SelectedModel
{
   get{ return m_SelectedModel; }
   set{
        m_SelectedModel = value;
    }
    NotifyPropertyChanged("SelectedModel");
    NotifyPropertyChanged("Models");
}

这两个公共属性在作为窗口数据上下文的模型中。 Observable Collection绑定到数据网格,SelectedItem绑定到SelectedModel,就像在XAML中一样:

<DataGrid x:Name="MyDataGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserResizeColumns="True" CanUserAddRows="False" CanUserSortColumns="True"
                                  SelectionMode="Single" SelectionChanged="DataGrid_SelectionChanged" ItemsSource="{Binding Models}"
                                  CanUserResizeRows="False" IsTextSearchEnabled="True" RowHeaderWidth="0" SelectedItem="{Binding SelectedModel, Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}" Grid.ColumnSpan="2" Margin="0,0,-0.4,-0.4">

因此,每当我更改SelectedModel时,数据网格中的SelectedItem都会更新。 这工作得很好,我已经能够基于SelectedItem填充其他数据。 确实,我的DataGrid_SelectionChanged事件处理程序在设置SelectedModel时被调用。

但是,无论何时选择新项目,我都希望数据网格自动滚动以显示SelectedItem。 我尝试了多种方法使它正常工作,但无济于事。 这是我尝试过的几件事(已确认此功能已通过调试器调用):

    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if(MyDataGrid.SelectedItem != null)
        {
           //All 3 of these have been tried separately and do not work
           MyDataGrid.ScrollIntoView(MyDataGrid.SelectedItem);
           MyDataGrid.ScrollIntoView(MyDataGrid.Items[MyDataGrid.SelectedIndex]);
           MyDataGrid.ScrollIntoView(_model.SelectedModel); //Didn't expect this one to work but just want to show that I'm trying things out here
        }
    }

我已经查看了ScrollIntoView的其他问题,但似乎都无法解决我的问题。 我将不胜感激。 谢谢。

2 个回复

不知道为什么它对您不起作用,但是它肯定可以正常工作。 在下面查看演示应用程序代码:

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserResizeColumns="True" CanUserAddRows="False" CanUserSortColumns="True"
                  SelectionMode="Single" SelectionChanged="DataGrid_SelectionChanged" ItemsSource="{Binding Items}"
                  CanUserResizeRows="False" IsTextSearchEnabled="True" RowHeaderWidth="0" SelectedItem="{Binding SelectedItem, Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}"
                  Grid.ColumnSpan="2" Margin="0,0,-0.4,-0.4">
            <DataGrid.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="Red" />
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

类文件

using System;
using System.ComponentModel;
using System.Linq;
using System.Timers;
using System.Windows;

namespace WpfApplication1
{
    public class Model
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private readonly Model[] items;

        public ViewModel()
        {
            items = Enumerable.Range(1, 101)
                              .Select(x => new Model
                              {
                                  Id = x,
                                  Name = $"Item {x}"
                              })
                              .ToArray();
        }

        public Model[] Items => items;

        private Model selectedItem;
        public Model SelectedItem
        {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItem)));
            }
        }

    }

    public partial class MainWindow : Window
    {
        private readonly Timer timer;
        private readonly ViewModel model;
        private readonly Random random;

        public MainWindow()
        {
            InitializeComponent();
            model = new ViewModel();
            random = new Random();
            timer = new Timer(2000);

            DataContext = model;

            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }

        private void Timer_Elapsed(Object sender, ElapsedEventArgs e)
        {
            var index = random.Next(model.Items.Length);
            model.SelectedItem = model.Items[index];
        }

        private void DataGrid_SelectionChanged(Object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            if (MyDataGrid.SelectedItem != null)
            {
                MyDataGrid.ScrollIntoView(MyDataGrid.SelectedItem);
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            timer.Stop();
            timer.Dispose();
        }
    }
}

在我看来,您的代码正在执行某些操作,可能会阻止框架滚动网格。

我能够使ScrollIntoView工作,但是我需要将ScrollToView函数放入数据网格的Loaded回调中。 以下是解决问题的示例:

    private void DataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        if(MyDataGrid.SelectedItem != null)
        {
            MyDataGrid.ScrollIntoView(MyDataGrid.SelectedItem);
        }
    }

我的猜测是,数据网格没有完全加载到SelectionChanged事件上,因此没有滚动到正确的位置。

2 scrollIntoView没有滚动到视图中

我有以下代码: 的HTML 问题是它更改了选项卡并稍微滚动了一点,但实际上并没有滚动到可以看到所选选项卡的位置。 它仅会转到选项卡的标题。 有没有一种方法可以在选项卡标题下滚动而不是仅滚动到标题? 解决方案 万一有人偶然发现它,可以解决此问题: ...

4 将WPF ListBox滚动到视图模型中的代码中设置的SelectedItem

我有一个带有列表框的XAML视图: 所选项目绑定到我视图中的属性。 当用户在列表框中选择一个项目时,视图模型中的SelectedFoo属性将得到更新。 当我在视图模型中设置SelectedFoo属性时,将在列表框中选择正确的项目。 问题是,如果当前在代码中设置的Selected ...

2012-01-11 22:16:20 8 37172   c#/ wpf/ mvvm
6 如何滚动到DataGrid中的选定内容?

我正在显示这样的Datagrid,并邀请用户进行选择... (在后面的代码中添加了其他三列)。 但是,当用户进行选择时,将执行回发操作,并且滚动位置会丢失。 我希望能够重设div以显示所选项目。 有谁知道如何做到这一点? 我尝试添加 到asp,但这无济于事。 我试图 ...

7 ScrollIntoView滚动到页面底部,而不是块的开始

我正在使用Javascript的scrollIntoView()发送到页面上div的开头。 在本地MAMP上似乎工作正常,但是无论我做什么,在线(在Shopify上)都滚动到页面底部。 我检查了没有两个具有相同ID的元素,我尝试了不同的元素,尝试了另一个选择器(document.getE ...

8 使用 scrollIntoView() 并滚动到所选元素的底部

我在 div 中有一个聊天消息列表,每次添加元素时都想滚动到底部。 我尝试调用一个函数来选择最后一个项目并使用scrollIntoView() 。 问题是它滚动到所选元素的顶部,而不是滚动到它的底部,这是将整个元素包含在视图中所必需的。 我预计: 我有: ...

9 无法删除DataGrid中的selecteditem

我有一个绑定联系人列表的DataGrid: 用户可以选择一个Item(联系人),然后将触发LoadContactInfo方法,该方法将加载SelectedItem的信息。 现在,每个项目都有一个复选框,当用户按下它时,该联系人将从“ Contacts集合中删除。 一切正常,但是有 ...

10 WPF绑定DataGrid中的SelectedItem

所以,我有一个TabControl绑定到一个项目列表(每个选项卡是一个项目) - 这很好。 每个选项卡的内容都是一个DataGrid,其中包含项目员工的列表 - 也可以正常工作。 现在,我想显示一些关于当前在DataGrid上选择的员工的信息。 这是一些代码:MainWindow.xaml ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM