问题标签 [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 回答
1989 浏览

wpf - 在 ObservableCollection 上实现 INotifyPropertyChanged 的​​目的是什么?

ObservableCollection实现INotifyCollectionChangedINotifyPropertyChanged

  • 我知道添加、删除(+清除)和替换项目是通过集合的事件 通知消费者的CollectionChanged,并且如果现有项目的更新可以使用项目的事件 来监控PropertyChanged它们自己实现INotifyPropertyChanged

  • 我从其他人那里了解到,您无法注册该集合的事件 PropertyChanged,因为它是只读的。

那么它的目的是什么,我们可以利用它做什么呢?

这里和那里的评论似乎使讨论变得混乱,暗示 的魔法ObservableCollection是实现两个接口,允许通知集合和项目内容更改,虽然这是不正确的(这被许多示例忽略了集合绑定到一个列表框,该列表框在项目内容更改后会神奇地更新,建议集合通知列表框)。

实际上,集合的唯一优势似乎就是执行INotifyCollectionChanged。处理项目属性更改似乎并不ObservableCollection比使用另一个集合更容易:只有当项目实现INotifyPropertyChanged时才有可能,他们可能不会这样做,并且如果用户设法独立于集合来挂钩此事件。

这个对吗?

0 投票
2 回答
1695 浏览

c# - PropertyChanged 影响几个属性

我有一种情况,我有几个变量的值相互依赖,如下所示:

A 是 B 和 C 的函数 B 是 A 和 C 的函数 C 是 A 和 B 的函数

任一值都可以在 UI 上更改。我正在做这样的计算和更改通知:

我在更改变量的设置器上调用计算方法,计算 _valB、_valC 的值(例如),然后为这些值调用 PropertyChanged。我这样做是因为变量之间的依赖关系,像这样我可以控制使用正确值计算哪个变量。我还考虑过为其他变量触发 PropertyChanged 并对变量的 getter 执行计算,但我必须知道之前更改过的属性并使用该值......不确定它是否是最佳/最简单的解决方案。

这是一个好方法吗?我不喜欢在 setter 块上执行此操作的想法,但当时我看不到任何更好的方法。您是否看到任何其他(更好或更清洁的解决方案)?

我遇到的另一个问题是使用 IdataErrorInfo 进行验证/向 UI 呈现错误信息。事情是 this[columnName] 索引器在设置器的末尾被调用,我需要在计算之前验证值,这样如果值输入无效,计算不会发生。我正在认真考虑放弃 IDataErrorInfo 并在计算发生之前简单地调用我的验证方法。有什么方法可以显式调用它或在价值归因之后立即调用它?

注意:ValidationRules 不是一个选项,因为我需要从我的 ViewModel 调用另一个对象的验证逻辑。

0 投票
2 回答
584 浏览

wpf - 使用 INotifyPropertyChanged 而不是 DependencyProperties 进行数据绑定

一个多星期以来,我一直在努力让数据绑定在 WPF 中工作。我确实在这里获得了有关 DataContext 的宝贵帮助,并且我确实通过 DependencyProperties 使数据绑定工作。当我学习数据绑定时,我遇到了很多关于INotifyPropertyChanged它在很多方面比 DP 更好的讨论。我想我会试一试。

我正在使用 Josh Smith 的基本 ViewModel 类,而我的 ViewModel 就是从它派生的。但是,我在让数据绑定工作时遇到了一些麻烦,希望这里有人能告诉我哪里出错了。

在我的 ViewModel 类中,我有一个ObservableCollection<string>. 在我的 GUI 中,我有一个绑定到这个 OC 的组合框,即

GUI的DataContext设置为ViewModel,即

并且 ViewModel 具有名为“PluginNames”的 OC:

加载 GUI 时,会调用一个方法来实例化 OC 并向其添加插件名称。OC修改后,我调用RaisePropertyChanged( "PluginNames"). 我期待,因为 WPF 数据绑定模型认识到 INotifyPropertyChanged,这就是我需要做的所有事情,它会“神奇地工作”并使用加载的插件更新组合框项目......但它没有。

有人可以指出我在这里做错了什么吗?谢谢!

更新:我不知道为什么,但现在不是没有进行任何明显的更新,而是根本找不到该属性。我认为我真的很愚蠢,并且在某个地方错过了重要的一步。

0 投票
5 回答
5960 浏览

wpf - MVVM 层次结构中的更改通知

假设在一些抽象的 ViewModel 基类中,我有一个普通的旧属性,如下所示:

然后,我创建了一个更具体的 ViewModel,继承自前一个,它包含以下属性:

现在,在某些 View 类中,我绑定到上述 ViewModel 的Rectangle属性。一切正常,直到我改变尺寸。当Size更改时,Rectangle不知道它并且更改不会传播到视图。而且由于Rectangle在子类中,我不能简单地将一个添加OnPropertyChanged("Rectangle")Size设置器中。

现在想象一下,我有许多不同的属性,例如Rectangle,它们都依赖于基类属性,并且这些更改都没有被传播。我需要一些轻量级和优雅的链接更改通知的方式,最好是不需要大量代码并且不会强迫我使用依赖属性的方式。

显然这里有很多丑陋的解决方案——我正在寻找的是干净和聪明的东西。在我看来,这将是一个非常常见的场景,在我看来,可能有一种对MVVM 友好的方式来执行此操作。

0 投票
2 回答
230 浏览

c# - WPF 数据绑定问题

我编写了一个非常短的应用程序,我试图在其中实现以下目标:CheckBox从代码中更改其状态。我已经连接了INotifyPropertyChanged界面并期待看到一些结果,但显然该应用程序什么也没做。数据绑定有问题吗?

窗口1.cs

Window1.xaml

0 投票
1 回答
1186 浏览

c# - 在 WPF 中验证几个链接的数据绑定文本框值

我试图找到一种优雅的方法来验证 WPF 中两个相关的 TextBox 值。

每个文本框的 Text 属性都绑定到我的类上的公共十进制属性,该类实现了用于 TwoWay 绑定的 INotifyPropertyChanged。

我想验证这两个值: BiggerValue >= SmallerValue >= 0

我已经使用 IDataErrorInfo 和字符串索引器成功地让每个值针对这些条件独立验证。

我的问题如下:用户打算减少两个值并从 BiggerValue 开始,所以现在它小于 SmallerValue。BiggerValue TextBox 上的验证失败(尽管值已存储)。然后用户继续使用 SmallerValue 并将其设置为小于新的 BiggerValue。现在两个值都再次有效,但我怎样才能让 BiggerValue 文本框自动反映其(未更改的)值现在有效?

我应该在文本框上查看诸如 LostFocus() 之类的事件处理程序,还是将类似的内容添加到属性设置器以强制刷新?

我的完整代码如下。不知何故,对于这个简单的问题,这一切都显得相当笨拙和过于复杂。作为 WPF 新手(这是第 2 天),任何关于我的方法的评论,无论多么激进,都将不胜感激。

XAML:

C#:

0 投票
2 回答
641 浏览

c# - 具有 INotifyPropertyChanged 的​​可空类型和属性

设置可空类型的值并实现 iNotifyPropertyChanged 似乎有点矫枉过正。有没有更好的方法来做到这一点?

我尝试使用简单的代码,但我在MyBase.RaisePropertyChanging("WorkPhone")上的断点永远不会被命中,并且值永远不会改变。

0 投票
1 回答
860 浏览

wpf - WPF:绑定自定义列表框和列表: PropertyChanged 始终为空

我已经自定义了在 XAML 中声明的 ListBox:

我需要与通用列表进行 dsiplay 和互操作,其中 T 是:

QonfBase 是非常简单的基类:

当我以编程方式打开 Activated 属性时,复选框不会更改状态。调试:PropertyChanged = null。有谁知道,什么是不正确的?

0 投票
2 回答
276 浏览

wpf - WPF:数据绑定中使用的集合的正确基类是什么?

我正在使用强类型集合类(例如CustomerCollection)构建对象模型。我想支持集合本身和集合中所有数据模型的完全双向绑定。

对于模型,实施似乎INotifyPropertyChanged是连接模型的正确方法。但是我应该使用什么接口/基类,以便 WPF 知道我的集合内容何时发生变化?

0 投票
2 回答
4274 浏览

c# - 在 DataContracts 上使用 INotifyChanged

我正在尝试将实际服务数据与服务功能分开,因此将数据作为包含多个属性(数据成员)的数据合同返回。客户端代码是使用 svcutil /edb 生成的,它还为代理代码生成 INotifyPropertyChanged 实现。据我的测试显示,该代码不会针对服务器上发生的更改调用 PropertyChanged 事件。此外,获取属性只会返回获取数据合约代理时的属性值。

基本上,这就是我所拥有的:

(服务器端)

(客户端)

我希望数据合约代理充当服务器数据合约的透明代理,但它似乎完全不受约束。

非常感谢,干杯,

罗莫特