【发布时间】:2012-11-19 13:35:42
【问题描述】:
在阅读 C# 2010 中的 Pro WPF 时,作者写道:
“您可以为每个属性引发一个事件。在这种情况下,事件必须具有名称 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"));
}
}
}
}
}
我将它绑定到 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 事件始终为空(我认为如果绑定引擎根据命名约定检测到它,它可能会自动订阅它)。 MyEmployees 只是一个 ObservableCollection
有人可以确认作者提到的此功能是否确实有效以及我是否犯了错误?
编辑:为了任何认为我误解了文字的人的利益:
"你可以使用三种方法来解决这个问题:
您可以使用 Product 类中的每个属性作为依赖属性 你在第 4 章学到的语法。(在这种情况下,你的类必须派生自 DependencyObject。)虽然这种方法让 WPF 为您完成工作 (这很好),它在元素中最有意义——具有视觉效果的类 出现在一个窗口中。对于像这样的数据类,这不是最自然的方法 产品。
您可以为每个属性引发一个事件。在这种情况下,事件必须具有 名称 PropertyNameChanged(例如 UnitCostChanged)。由你决定 当属性改变时触发事件。
您可以实现 System.ComponentModel.INotifyPropertyChanged 接口,它需要一个名为 PropertyChanged 的事件。那么你必须 每当属性更改时引发 PropertyChanged 事件并指示哪个 通过以字符串形式提供属性名称来更改属性。它仍然取决于 您可以在属性更改时引发此事件,但您不需要定义 每个属性的单独事件。”
【问题讨论】:
-
不确定该语法是否有效,但您很确定需要将类装饰为实现 iNotifyPropertyChanged
-
不,这正是我要避免的——在书中,它提到了 3 种技术是 a.) 使用 DependencyProperties b.) 使用 INotifyPropertyChanged(我已经很熟悉了)c .) 使用这种基于约定的方法,它不实现 INotifyPropertyChanged ..这就是我在这里测试的重点:)
-
好的理解,但我认为这不是所声称的。您可以在没有 NotifyPropertyChanged 方法的情况下直接引发事件,但我认为您仍然需要实现 INotifyPropertyChanged。
-
书中以互斥方式描述了这3种方法
-
这些是在属性更改时通知的方法,但这并不意味着“绑定引擎”会自动订阅具有该约定的事件。绑定引擎仅(至少自动)与 Dependency Properties 和 INotifyPropertyChanged(或 INotifyCollectionChanged)一起工作
标签: c# .net wpf data-binding inotifypropertychanged