- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前在 WPF 中遇到一个问题,当重新实例化绑定(bind)的 ObservableCollection 时,DataGrid 的水平 ScrollViewer 会捕捉到可能的滚动空间的右侧(显示 DataGrid 最右边的内容)。
即使我在调用绑定(bind)事件时触发手动将 HorizontalOffset 设置为 0 的行为,并在重新绑定(bind)列表后立即调用该事件,0 也会被忽略并且捕捉再次转到右侧。我认为这与 ScrollViewer 中的操作顺序和命令队列有关。
这似乎应该是默认行为(我不确定为什么您会希望在填充数据时滚动条默认对齐到右侧)。有人知道解决此问题的方法吗?
根据要求,我的复制项目中的代码文件。
MainWindow.xaml
<Window x:Class="WpfScrollViewer.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:WpfScrollViewer"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<Button Content="Rebind" Command="{Binding RebindCommand}"/>
<Button Content="Clear and Set" Command="{Binding ClearCommand}"/>
</StackPanel>
<DataGrid ItemsSource="{Binding People}" Grid.Row="1" HorizontalScrollBarVisibility="Visible" FontSize="30">
</DataGrid>
</Grid>
Person.cs
namespace WpfScrollViewer
{
public class Person
{
public string FirstNames { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string PostCode { get; set; }
public string PhoneNumber { get; set; }
}
}
DelegateCommand.cs
using System;
using System.Windows.Input;
namespace WpfScrollViewer
{
public class DelegateCommand : ICommand
{
private readonly Action _fn;
private readonly Func<bool> _canExecute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action fn, Func<bool> canExecute = null)
{
_fn = fn;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
return _canExecute();
}
public void Execute(object parameter)
{
_fn();
}
}
}
MainViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
namespace WpfScrollViewer
{
public class MainViewModel : INotifyPropertyChanged
{
private readonly Random _random = new Random();
private ObservableCollection<Person> _people;
public ObservableCollection<Person> People
{
get => _people;
set
{
if (_people == value)
{
return;
}
_people = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(People)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public ICommand RebindCommand { get; }
public ICommand ClearCommand { get; }
public MainViewModel()
{
RebindCommand = new DelegateCommand(RebindPeople);
ClearCommand = new DelegateCommand(ClearAndSetPeople);
}
private void RebindPeople()
{
People = new ObservableCollection<Person>(GetPeople());
}
private void ClearAndSetPeople()
{
var people = GetPeople();
People.Clear();
foreach (var person in people)
{
People.Add(person);
}
}
private List<Person> GetPeople()
{
var people = new List<Person>
{
new Person
{
FirstNames = "John",
LastName = "Doe",
Address = "17 Random Street",
PostCode = "RN32 2JR",
Age = 31,
PhoneNumber = "07647123456"
},
new Person
{
FirstNames = "Jane",
LastName = "Doe",
Address = "17 Random Street",
PostCode = "RN32 2JR",
Age = 30
},
new Person
{
FirstNames = "Jack",
LastName = "Freens",
Address = "37 Badboi Lane",
Age = 30
},
new Person
{
FirstNames = "Richard",
LastName = "Brodget",
Address = "69 Meme Street",
Age = 31
},
new Person
{
FirstNames = "Sam",
LastName = "Orfitt",
Address = "16 Withernsea Road",
Age = 29
},
new Person
{
FirstNames = "Tom",
LastName = "Orfitt",
Address = "16 Withernsea",
Age = 27
}
};
var rmCount = _random.Next(1, 4);
for (var i = 0; i < rmCount; i++)
{
people.RemoveAt(_random.Next(people.Count));
}
return people;
}
}
}
使用“重新绑定(bind)”按钮会显示我在上面描述的行为。确保您稍微向右滚动,水平滚动条将在重新绑定(bind)时捕捉到右侧。如果滚动条完全位于左侧,水平滚动条将正确地向左对齐,正如我希望它在所有情况下都这样做。
干杯
最佳答案
这是由列自动生成功能引起的。每次更改数据时,它都会删除所有列(我猜在这个阶段滚动条位置丢失)并根据传递的数据创建新列。如果您静态定义列并使用 AutoGenerateColumns="False"
参数禁用该功能,它不会重置滚动条位置。
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}" Grid.Row="1" HorizontalScrollBarVisibility="Visible" FontSize="30">
<DataGrid.Columns>
<DataGridTextColumn Header="FirstNames" Binding="{Binding FirstNames}" />
<DataGridTextColumn Header="LastName" Binding="{Binding LastName}" />
<DataGridTextColumn Header="Age" Binding="{Binding Age}" />
<DataGridTextColumn Header="Address" Binding="{Binding Address}" />
<DataGridTextColumn Header="PostCode" Binding="{Binding PostCode}" />
<DataGridTextColumn Header="PhoneNumber" Binding="{Binding PhoneNumber}" />
</DataGrid.Columns>
</DataGrid>
如果您想动态生成列并且还需要记住滚动条位置,您可以使用反射从代码后面生成列。缺点是不能绑定(bind),必须手动生成。例如
<DataGrid AutoGenerateColumns="False" Loaded="DataGrid_Loaded" ItemsSource="{Binding People}" Grid.Row="1" HorizontalScrollBarVisibility="Visible" FontSize="30">
</DataGrid>
和DataGrid_Loaded:
DataGrid dg = (DataGrid)sender;
MainViewModel mvm = (MainViewModel)this.DataContext;
Type classType = typeof(Person);
PropertyInfo[] properties = classType.GetProperties();
foreach (PropertyInfo prop in properties) {
dg.Columns.Add(new DataGridTextColumn() {
Binding = new Binding(prop.Name),
Header = prop.Name
});
}
关于c# - WPF:DataGrid 上的水平滚动查看器在重新实例化绑定(bind)的 ObservableCollection 时捕捉到右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090666/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!