在Silverlight中检测DataContext的更改

5

我有一个多部分问题:

(1) 为什么Silverlight没有暴露DataContextChanged事件?如果微软的某个人只是在FrameworkElement类中将internal更改为public(就像WPF一样),那么很多麻烦都可以避免。

(2) 我已经找到onetwo不同的方法来通过使用DependencyProperties来突破DataContextChanged事件。但是我无法可靠地让它们正常工作。我的测试结果显示,它们可以为我连接的第一个类正确触发DataContextChanged事件,但对于任何其他类都不会触发。是否有人遇到过这个问题?或者更好的是,他们已经解决了这个问题吗?

(3) 我想知道我的DataContext何时更改的原因是,有些UI操作在XAML中很难做到完美,但在代码后台却很简单;对于其中许多操作,我需要处理ViewModel引发的事件;因此我需要知道我的ViewModel何时更改,以便我可以连接事件处理程序。这是一个准确的世界观吗?还是我想在代码后台处理这种事情的事实,表明我的思维已经偏离了正确轨道?我不是MVVM纯粹主义者:我只想快速编写出好的代码,而且我并不特别关心如何达到目标。代码后台在过去十年里一直为我提供了相当好的服务,我不想完全放弃它。但是我的实用主义是否使自己在这一点上更加困难?


我听说您在过去十年中一直使用代码后台,它为您服务得很好。 - Ralph Shillington
2
说句实话,这个事件应该在Silverlight 5中公开(http://www.dotblogs.com.tw/kan/archive/2011/01/28/21097.aspx),虽然我相信现在这并不能给你带来太多安慰。 - RobSiklos
好的,知道了。我之前没注意到。 - Ken Smith
1个回答

2
“但是我的实用主义是否在这一点上让自己更加困难?” 我不会称之为实用主义,我会称之为对变化的恐惧;停留在你的舒适区。如果你放弃旧的思维方式,拥抱新的思维方式,生活其实会更容易(我知道你的感受 - 我曾经和你一样,使用code-behind)。现在,离开我的宣传,给你一个更实际的答案:
当你想要检测模型中的更改时,请连接到允许您检测模型中更改的事件。DataContext并不是真正的模型...所有模型对象都将具有INotifyPropertyChanged的实现。你应该针对给定模型连接到它,或者针对ObservableCollection连接到类似的东西。
Silverlight/WPF现在使所有这些东西都变得更容易了,因为数据绑定真正地起作用了。
不要与框架斗争。不要带着旧的ASP.Net惯例来参与这个游戏...这样做不会有帮助的。你会失去框架功能的最佳部分。
干杯。

这实际上是我想做的事情——在我的ViewModel中有一些PropertyChanged和CollectionChanged事件,我希望我的表单能够响应它们,但由于各种原因,在直接使用XAML(如绑定到RichTextBox)时很难处理。但我需要知道要附加事件处理程序,希望通过检测DataContext何时更改来实现。目前我所做的是退而求其次,使用一个单独的Initialize()方法。虽然不够干净,但它可以工作。感谢您对学习如何干净地使用MVVM的想法。 - Ken Smith
我认为一个Initialize()方法是非常合适的,Ken。基本上这就是我的做法。当页面加载时,我会调用类似_viewModel.Initialize()的东西,在里面我会做一些初始工作:初始化Context数据、填充表单下拉框等等。 - Chris Holmes
手动设置DataContext(以处理初始化内容)似乎很愚蠢,因为它可以通过XAML设置一次,然后继承。我想这就是为什么他们在SL5中添加了对此的支持的原因 :-)。 - Ken Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接