【问题标题】:Automatic INotifyPropertyChanged after change in View视图更改后自动 INotifyPropertyChanged
【发布时间】:2016-08-09 01:12:28
【问题描述】:

假设我有一个 MVVM 应用程序,其中包含项目的 ListView 和一个编辑所选项目的属性(文本)的文本框。

<TextBox Text="{Binding SelectedItem.Text}"/>
<ListBox ItemsSource="{Binding Items}" DisplayMemberPath="Text" SelectedItem="{Binding SelectedItem}"

在我的 ViewModel 中,我有一个 ObservableCollection 项目。每个项目都实现 INotifyPropertyChanged 并具有所需的属性。如果我更改 TextBox 的文本,则列表不会更新,因为我只有一个没有通知的属性:

public class Item : INotifyPropertyChanged
{
    public string Text { get; set; }
}

我的问题是:有没有办法在不使用 PropertyChanged 的​​情况下更新我的列表的文本属性?:

private string _Text;
public string Text
{
  ...
  set
  {
    _Text = value;
    PropertyChanged("Text");
  }
}

有没有办法在更改我的 TextBox 的文本后直接从我的视图中触发 PropertyChanged - 或其他方法?

感谢您的帮助!

【问题讨论】:

  • 你的TextBox在哪里?我只看到TextBlock。为什么不能从视图模型中引发 PropertyChanged 事件?
  • 返回您在下方留下的现已删除的评论,然后点击您留下的链接。然后阅读该答案的内容。然后将其与您的 Item 类及其 Text 属性进行比较。答案就在眼前。
  • @dkozl:我将 TextBlock 更改为 TextBox ...我的错误。如果没有实现 INotifyPropertyChanged,它就可以在没有任何通知的情况下工作(看这里:stackoverflow.com/questions/7767218/…)。现在我实现了 INPC,我不想在我的项目的每个属性上添加通知(这只是一个最小的示例)
  • @slugster:我已经读了好几遍了……但我真的不知道如何使用它。你能给我一个提示吗?

标签: c# wpf mvvm binding inotifypropertychanged


【解决方案1】:

好的,我会留下一个答案,而不是一个有点神秘的评论(我这样做是因为如果你自己发现答案而不是被灌输,你实际上会学得更好......)。

您留下的previous link 表示:

如果您正在实施 INotifyPropertyChanged,则您有全权负责在需要将数据绑定到 UI 的属性的每个 setter 中实施更改通知。否则,更改将不会像您期望的那样同步。

(强调我的。为了完整起见,这里是那个答案留下的链接:MSDN forums: Data binding without INotifyPropertyChanged)。

以前您依赖于 WPF 的默认行为,但是当您实现 INotifyPropertyChanged 时,您实际上是在说 “哟 WPF!我想非常具体和具体地了解通知的内容,以便默认行为可以采取后排座位!”。然后,您未能在 Text 属性上添加通知。因此,根据您的编码决定,WPF 绑定不再检测该类中的属性更改,除非您专门触发它们。

就我个人而言,我总是实现 INotifyPropertyChanged,因为即使通过代码更改了值,仍然会通知属性更改(因为默认使用的 PropertyDescriptor 不会检测到这一点)。此外,它让我可以灵活地不通知,或者在一个属性发生变化时通知多个属性。

【讨论】:

  • 感谢您的回答@slugster。这是一个非常清楚的描述。该链接描述了 WPF 自动绑定到没有 INPC 的 PropertyDescriptor。就我而言,我不必检测代码中 Text-property 的更改。有没有办法或解决方法将 INPC 用于我的整个对象,而 WPF 自动机制仅用于这个单一的文本属性?
  • 不,没有办法同时这样做。使用 INPC 意味着您可以完全控制。不过,您可以简化流程,检查我的this old answer,它消除了一些苦差事(该答案中的代码是 .Net 4.5 和 CallerMemberName 之前的代码)。这也只是一个示例,您可以在一堆 different ways 中扩展该方法。
  • 感谢您的精彩回答!对于我的项目,这并不是我真正想听到的答案......但现在我知道确切的问题是什么了。
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多