【问题标题】:Detecting DataContext changed in Silverlight检测 Silverlight 中更改的 DataContext
【发布时间】:2011-02-08 18:01:03
【问题描述】:

我有一个多部分的问题:

(1) Silverlight 不公开 DataContextChanged 事件是否有充分的理由?如果微软的某个人只是将 FrameworkElement 类中的 internal 更改为 public(就像 WPF 一样),似乎可以避免很多麻烦。

(2) 我发现 one 或 two 不同的方法可以通过在一种或另一种配置中使用 DependencyProperties 来侵入 DataContextChanged 事件。但我无法让它们可靠地工作。到目前为止,我的测试似乎表明,对于我将它们连接到的第一个类,它们触发了被黑的 DataContextChanged 事件就好了,但不会为任何其他类触发。有没有其他人遇到过这个问题?或者更好的是,他们是否已经解决了这个问题?

(3) 我一直想知道我的 DataContext 何时更改的原因是,有一些 UI 操作在 XAML 中很难正确处理,但在代码隐藏中却很简单;对于其中许多事情,我需要处理 ViewModel 引发的事件;因此我需要知道我的 ViewModel 何时发生变化,以便连接事件处理程序。这是正确的世界观吗?或者我想在代码隐藏中处理这类事情的事实是否很好地表明我的想法已经偏离了轨道?我不是 MVVM 纯粹主义者:我只想从这里快速获得好的代码,我并不特别关心我是如何到达那里的。十多年来,代码隐藏已经为我提供了相当不错的服务,我不愿意完全放弃它。但在这一点上,我的实用主义是否让我自己更难了?

【问题讨论】:

  • 我听说你在代码隐藏中为你服务了十多年。
  • 不管怎样,这个事件应该会在 Silverlight 5 (dotblogs.com.tw/kan/archive/2011/01/28/21097.aspx) 中公开,尽管我确信现在这是一个小小的安慰。
  • 很高兴知道。我错过了。

标签: silverlight mvvm


【解决方案1】:

“但是我的实用主义让事情变得更难了 在这一点上我自己?”

我不会称之为实用主义。我称之为对变化的恐惧;留在你的舒适区。如果您放弃旧的思维方式并拥抱新的思维方式,生活实际上会容易得多(我完全知道您的意思 - 我和您在代码隐藏方面处于同一条船上)。

现在,离开我的肥皂盒,来个更实际的答案:

当您想要检测模型中的更改时,请连接到允许您检测您的模型中的更改的事件。 DataContext 并不是真正的模型...您的所有模型对象都将具有 INotifyPropertyChanged 的​​实现。您应该为给定的模型挂钩,或者为 ObservableCollection 挂钩类似的东西。

Silverlight/WPF 让所有这类事情变得更加容易,因为数据绑定确实有效。

不要与框架抗争。不要将旧的 ASP.Net 实践带到这个游戏中......它不会帮助你。这样,您将失去框架功能的最佳部分。

干杯。

【讨论】:

  • 这实际上是我想要做的——在我的 ViewModel 中有一些 PropertyChanged 和 CollectionChanged 事件,我希望我的表单响应这些事件,并且由于各种原因很难处理在直接的 XAML 中(如绑定到 RichTextBox)。但是我需要知道要附加我的事件处理程序的内容,并且希望通过检测 DataContext 何时更改来做到这一点。我现在所做的是回退到一个单独的 Initialize() 方法。它不像我想要的那样干净,但它有效。不过,感谢您对学习如何干净地执行 MVVM 的想法。
  • 我认为 Initialize() 方法是完全合适的 Ken。这就是我所做的,基本上。当页面加载时,我会调用类似 _viewModel.Initialize() 的方法,并在其中执行我需要做的任何初始工作:初始加载上下文数据、填充表单下拉列表等。
  • 当它可以通过 XAML 设置一次然后继承时,必须手动设置 DataContext(处理初始化的东西)似乎很愚蠢。我想这就是他们在 SL5 中添加对此的支持的原因:-)。
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 2011-11-03
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多