问题标签 [inotifypropertychanged]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3327 浏览

silverlight - 计算属性的 PropertyChanged 通知

我正在 Silverlight2 中开发应用程序并尝试遵循 Model-View-ViewModel 模式。我将某些控件上的 IsEnabled 属性绑定到 ViewModel 上的布尔属性。

当这些属性派生自其他属性时,我遇到了问题。假设我有一个保存按钮,我只想在可以保存时启用它(数据已加载,我们目前不忙于在数据库中做事)。

所以我有几个这样的属性:

现在我想做的是:

但请注意缺少属性更改通知。

所以问题是:什么是公开我可以绑定到的单个布尔属性的干净方法,但是计算而不是显式设置并提供通知以便 UI 可以正确更新?

编辑: 感谢大家的帮助 - 我开始着手制作自定义属性。我在这里发布源代码以防有人感兴趣。我确信它可以以更清洁的方式完成,所以如果您发现任何缺陷,请添加评论或答案。

基本上我所做的是创建一个接口,它定义了一个键值对列表来保存哪些属性取决于其他属性:

然后我在每个属性上都设置了属性:

属性本身只存储一个字符串。您可以为每个属性定义多个依赖项。该属性的核心在 BuildDependentPropertyList 静态函数中。您必须在类的构造函数中调用它。(有人知道是否有办法通过类/构造函数属性来做到这一点?)在我的情况下,所有这些都隐藏在基类中,所以在子类中你只需将属性放在属性上。然后修改您的 OnPropertyChanged 等效项以查找任何依赖项。下面以我的 ViewModel 基类为例:

最后,在受影响的属性上设置属性。我喜欢这种方式,因为派生属性包含它所依赖的属性,而不是相反。

这里最大的警告是,它仅在其他属性是当前类的成员时才有效。在上面的示例中,如果 this.Session.IsLocked 发生更改,则通知不会通过。我解决这个问题的方法是订阅 this.Session.NotifyPropertyChanged 并为“Session”触发 PropertyChanged。(是的,这会导致事件在他们不需要的地方触发)

0 投票
1 回答
591 浏览

.net - 在 DataGridView 中更新多个选定的 INofityPropertyChange 对象

我正在使用启用了 MultiSelect 的DataGridView(Windows 窗体),它放置在用户控件中。我想通过调用实现以下代码的公共方法来更新用户控件外部的所有选定行:

Unfortunately, when multiple rows are selected, only one DataGridViewRowis immediately refreshed, namely the one that was last selected. 基础对象发生更改,并触发 NotifyPropertyChange 事件。此外,当我在更新后更改选择时,我会看到所有行都按照我希望它们立即更新的方式进行了更新。

第二件事,非常奇怪:当我在Rating触发 NotifyPropertyChange 的 -property 的 Setter 中设置断点并在那里等待几秒钟,然后继续执行代码时,一切正常(所有行都立即更新)。如果我不等待而是在每次通过断点时非常快速地按 F5,我就会得到上面描述的效果。

我的业务对象看起来像这样(当然显着缩短):

是否有人也已经注意到这种行为,或者甚至知道解决方案(或解决方法)?

0 投票
2 回答
4890 浏览

linq - DataContext Refresh 和 PropertyChanging & PropertyChanged 事件

我处于从外部来源获悉某个特定实体已在我当前数据上下文之外更改的情况。我能够找到实体并像这样调用刷新

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);

并且实体上已更改的属性已正确更新。但是,当刷新发生时,INotifyPropertyChanging INotifyPropertyChanged 似乎都没有出现,这使我的 UI 显示不正确的信息。

我知道 Refresh() 未能在实体上使用正确的属性获取器和设置器来引发更改通知事件,但也许还有另一种方法可以完成同样的事情?

难道我做错了什么?有没有比刷新更好的方法?如果刷新是唯一的选择,有没有人可以解决?

0 投票
1 回答
10747 浏览

c# - 如何从 [Serializable] INotifyPropertyChanged 实现者中排除不可序列化的观察者?

我有将近一百个看起来像这样的实体类:

注意 上的[field:NonSerialized]属性PropertyChanged。这是必要的,因为某些观察者(在我的情况下 - 显示编辑实体的网格)可能无法序列化,并且实体必须是可序列化的,因为它是由运行在单独机器上的应用程序通过远程处理提供的.

此解决方案适用于琐碎的情况。然而,有些观察者可能是[Serializable],并且需要被保留。我该如何处理?

我正在考虑的解决方案:

  • 完全ISerializable- 自定义序列化需要编写大量代码,我不想这样做
  • 使用[OnSerializing][OnDeserializing]属性PropertyChanged手动序列化-但那些辅助方法仅提供SerializationContext,AFAIK不存储序列化数据(SerializationInfo这样做)
0 投票
1 回答
6375 浏览

c# - 如何使用 INotifyPropertyChanged 更新列表框项目

我有一个列表框,它数据绑定到一组对象。我想修改项目的显示方式,以向用户显示这些对象中的哪一个是我程序中的 START 对象。

我尝试通过以下方式执行此操作,但列表框不会自动更新。使控件无效也不起作用。

我能找到的唯一方法是完全删除数据绑定并重新添加。但就我而言,这是不可取的。

还有其他方法吗?

这是管理列表和作为开始的项目的类

在表格中,我使用以下代码

0 投票
3 回答
1174 浏览

c# - 为什么 INotifyPropertyChanged 仅在至少更改两个字符时才会触发?

我终于得到了一个 Silverlight MVVM 示例,这样当我更改名字和姓氏文本框的值时,全名会自动更改。

然而,奇怪的是,我从 INotifyPropertyChanged 继承的模型只有在我更改名字或姓氏的至少 2 个字符时才会收到通知。

  • 如果我将“Smith”更改为“Smith1”,则不会触发任何事件
  • 如果我将“Smith”更改为“Smith12”,则按预期触发事件

有没有人在 Silverlight/XAML/INotifyPropertyChanged 中遇到过这个问题?会是什么呢?是否有一个设置指示文本框在通知自己“已更改”之前需要更改多少?

以下是我正在使用的代码的主要部分:

客户.cs:

CustomerHeaderView.xaml:

客户视图模型.cs:

MainPage.xaml.cs:

更新:

我在 WPF 中重新制作了这个项目,它工作正常。也许这是 Silverlight 3 的问题。

0 投票
17 回答
52382 浏览

c# - 在 MVVM 中,ViewModel 或 Model 是否应该实现 INotifyPropertyChanged?

我处理过的大多数 MVVM 示例都有Model实现 INotifyPropertyChanged,但在Josh Smith 的 CommandSink 示例 中 ViewModel 实现了INotifyPropertyChanged

我仍在认知上将 MVVM 概念放在一起,所以我不知道是否:

  • 您必须将其放入INotifyPropertyChangedViewModel 才能开始CommandSink工作
  • 这只是规范的偏差,并不重要
  • 您应该始终实现模型INotifyPropertyChanged,这只是一个错误,如果将其从代码示例开发为应用程序,则可以更正

其他人在您从事的 MVVM 项目上有何经验?

0 投票
5 回答
6505 浏览

c# - 为什么 INotifyPropertyChanged 不更新 XAML 中的变量?

我想模拟模型中的数据更改并将该数据反映在 XAML 中。据我了解,我需要实现 INotifyPropertyChanged。

但是,在以下代码示例中,XAML 仅显示来自客户的数据一次,但日期和时间不会更改。

在以下示例中,我必须更改哪些内容才能使 XAML 在模型中更改时不断显示当前日期和时间?

特别是,我不明白绑定如何知道何时检查模型,每秒?每秒10次?它没有响应任何事件。我在这里想念什么?

XAML:

代码背后:

0 投票
1 回答
555 浏览

wpf - 包含 i 列表的属性上的 INotifyPropertyChanged

嗨,我在 myClass 中使用此代码来更改我的 wpf 应用程序中的内容

每次我更改 myClass 中的属性时,它都会更改我的应用程序中的标签。

这工作得很好,但在 myClass 我有一个属性包含另一个类的 ilist 文章

现在我的问题是,Notify 方法不会更新我的 Ilist 中的内容,我是否可以通过 ilist 和视图使其更新。如果 myclass 是 string 或 int,则 myclass 中的所有属性都可以正常工作,但是当它是 Ilist 时,它不会更新。希望你们明白我的意思是我的英语不好。谢谢你的帮助

这里是xaml中的代码

{Binding Path=Articles} <-- 这是包含 ilist 的属性 <-- 这是 Article 类中的属性

0 投票
1 回答
298 浏览

wpf - 自动更新 wpf 中的列表

我想显示一堆我在 ListBox 中创建的对象。我的对象实现了 INotifyPropertyChanged 接口。我尝试使用 ObservableCollection,我已将其绑定到列表框控件 (listbox1.DataContext = MyCollection) 但这并不完全是我想要做的,因为当我的一个对象的属性之一在MyCollection 更改。我发现了这篇博文:http: //sweux.com/blogs/psampaio/index.php/2009/04/13/creating-a-custom-observable-collection-in-wpf

这真的是跟踪多个对象的最简单/唯一的方法吗?