gpt4 book ai didi

.net - 这是 WPF 数据网格错误吗?

转载 作者:行者123 更新时间:2023-12-04 18:12:10 25 4
gpt4 key购买 nike

这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the help center .




9年前关闭。




我有以下概念证明:

XAML 窗口:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=Enabled}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>

后面的代码:
using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
public ObservableCollection<Data> Items { get; private set; }

public MainWindow()
{
InitializeComponent();
this.Items = new ObservableCollection<Data>();
this.DataContext = this;
for (int index = 0; index < 30; index++)
{
this.Items.Add(new Data() {Enabled = true });
}
}
}

public class Data
{
public bool Enabled { get; set; }
}
}

执行应用程序,取消选中顶部的一些框,向下滚动,再次更改一些框并向上滚动。瞧,复选框再次被选中!

我是否遗漏了什么,或者我应该向 Microsoft 填写一个错误?

编辑 :感谢您的回复,但它与 INotify 或 Checkbox 无关,与 TextBox 和 INotify 相同。滚动后您不需要单击复选框,只需取消选中一些,向下滚动,向上滚动并瞧,它们会再次被选中。检查此代码:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=Enabled}" />
<TextBox Text="{Binding Text}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>

以及背后的代码:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
public ObservableCollection<Data> Items { get; private set; }

public MainWindow()
{
InitializeComponent();
this.Items = new ObservableCollection<Data>();
this.DataContext = this;
for (int index = 0; index < 30; index++)
{
this.Items.Add(new Data() { Enabled = true, Text = index.ToString() });
}
}
}

public class Data : INotifyPropertyChanged
{
private bool _enabled;
public bool Enabled
{
get { return _enabled; }
set
{
if (value != _enabled)
{
_enabled = value;
this.OnPropertyChanged("Enabled");
}
}
}

private string _text;
public string Text
{
get { return _text; }
set
{
if (value != _text)
{
_text = value;
this.OnPropertyChanged("Text");
}
}
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string name)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}

#endregion
}
}

最佳答案

此问题与回收无关。事实上,禁用回收隐藏了真正的问题:您的 Data对象属性永远不会更新。尝试在 Enabled 中设置断点或 Text setter 并且您会看到当您更改文本或选中/取消选中该框时不会发生任何事情。当您滚动并向后滚动时,会从对象中重新读取属性,并且由于它没有更改,因此复选框会正确更新以匹配 Enabled属性(property)。

一个 DataGrid意味着默认情况下所有行都处于显示模式,用户在需要时切换到当前选定行的编辑模式。在用户验证整行之前,不会提交这些值。

在幕后,隐含的 BindingGroup 为整行创建,有效地将所有绑定(bind)设置为 UpdateSourceTrigger.Explicit .当用户完成对行的编辑时,将提交此绑定(bind)组。在你的情况下,因为没有 BeginEdit ,不会有任何CommitEdit并且这些值永远不会更新。

您在这里有几种解决方案:

  • 使用另一个没有这种“切换到编辑模式”行为的控件,例如 ListView .
  • 强制 UpdateSourceTriggerPropertyChangedLostFocus在每个绑定(bind)上。
  • 更改用户使用网格的方式以符合 DataGrid行为。
  • 关于.net - 这是 WPF 数据网格错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11565875/

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