gpt4 book ai didi

c# - 没有 INotifyPropertyChanged 的​​更改通知? (摘自 Pro WPF in C# 2010)

转载 作者:太空狗 更新时间:2023-10-29 18:25:17 27 4
gpt4 key购买 nike

作者在阅读 Pro WPF in C# 2010 时写道:

“您可以为每个属性引发一个事件。在这种情况下,该事件的名称必须是 PropertyNameChanged(例如,UnitCostChanged)。您可以在属性更改时触发该事件。”

有人可以确认此功能有效吗?我正在试验,但无法重现这种行为(我想看看这是否有效,然后我可以用 System.Reflection.Emit 做一些试验来创建动态类型)

编辑:我应该澄清这里的重点是在不实现 INotifyPropertyChanged 的​​情况下实现变更通知,因为这就是本书所声称的

这是我正在测试的 POCO:

public class Employee
{
private string _FirstName;
public string FirstName
{
get
{
return _FirstName;
}
set
{
if (_FirstName != value)
{
_FirstName = value;
if (FirstNameChanged != null)
{
FirstNameChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
}
}
}

我将它绑定(bind)到 DataGrid 并在后台设置一个计时器,每隔几秒随机更新一次 FirstName 属性,但 DataGrid 永远不会触发

<DataGrid x:Name="dgEmployees" ItemsSource="{Binding ElementName=mainWindow, Path=MyEmployees}">
<DataGrid.Columns>
<DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
</DataGrid.Columns>
</DataGrid>

FirstNameChanged 事件始终为 null(我认为如果绑定(bind)引擎根据命名约定检测到它,它可能会自动订阅它)。 MyEmployees 只是一个 ObservableCollection

有人可以确认作者提到的这个功能是否确实有效,以及我是否犯了错误?

编辑:为了任何认为我误解了文本的人的利益:

“您可以使用三种方法来解决这个问题:

您可以使用你在第 4 章学到的语法。(在这种情况下,你的类必须派生自DependencyObject。)尽管这种方法让 WPF 为您完成工作(这很好),它在元素中最有意义——具有视觉效果的类在窗口中的外观。对于像这样的数据类,这不是最自然的方法产品。

您可以为每个属性引发一个事件。在这种情况下,事件必须具有名称 PropertyNameChanged(例如,UnitCostChanged)。这取决于你当属性更改时触发事件。

您可以实现 System.ComponentModel.INotifyPropertyChanged接口(interface),它需要一个名为 PropertyChanged 的​​事件。那你必须每当属性更改时引发 PropertyChanged 事件并指示哪个通过以字符串形式提供属性名称来更改属性。这仍然取决于您可以在属性更改时引发此事件,但您不需要定义每个属性的单独事件。”

最佳答案

我会说,很可能在不使用 INotifyPropertyChanged 或依赖属性的情况下在您的 POCO 中实现更改通知,就像书中所声称的那样,除非我完全忽略了问题的要点。

如果您在属性值更改时从您的 POCO 引发一个名为 {Propertyname}Changed 的事件,WPF 绑定(bind)系统将拾取该事件并更新相关绑定(bind)。

查看这个小程序进行演示 - 这是我能想到的最简单的事情,但我想它也应该适用于您的情况。

XAML:

<StackPanel>
<TextBlock Text="{Binding Name}" />
<Button Content="Change name" Click="changeNameClick" />
</StackPanel>

代码隐藏:

public partial class Window1 : Window
{
private SimpleObject so = new SimpleObject();

public Window1()
{
InitializeComponent();

this.so = new SimpleObject();
so.Name = "Initial value";

this.DataContext = so;

var t = new DispatcherTimer(
TimeSpan.FromSeconds(1),
DispatcherPriority.Normal,
(s, e) => { this.so.Name = "Name changed at: " + DateTime.Now.ToString(); },
Dispatcher);
}

private void changeNameClick(object sender, RoutedEventArgs e)
{
this.so.Name = "New value!!";
}
}

public class SimpleObject
{
private string mName = null;

public string Name
{
get { return mName; }
set
{
if (mName != value)
{
mName = value;

if (NameChanged != null)
NameChanged(this, EventArgs.Empty);
}
}
}

public event EventHandler NameChanged;
}

关于c# - 没有 INotifyPropertyChanged 的​​更改通知? (摘自 Pro WPF in C# 2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660340/

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