【发布时间】:2013-09-22 17:21:57
【问题描述】:
我正在尝试提出一种使用实体框架实现 MVVM 模式的好方法,其中我的实体是我的模型。我的DataContext 是我的视图模型。这是问题的一个小再现。
查看
<TextBox Text="{Binding MyText}" />
视图模型:
我需要从我的数据库中逐条导航记录。单击视图中的按钮时,会向执行nextRecord() 的视图模型发送命令。 EF 发挥了它的魔力,_myObject 是数据库中的下一行/记录
public class myViewModel: INotifyPropertyChanged
{
private MyEntityObject _myObject;
public string MyText
{
get { return _myObject.MyText; }
set
{
if (_myObject.MyText != value)
{
_myObject.MyText = value;
OnPropertyChanged("MyText");
}
}
}
private void _nextRecord()
{
_myObject = myEntitiesContext.NextRecord() //pseudocode
}
}
自动生成的实体模型
public partial class MyEntityObject
{
public string MyText { get; set; }
}
由于 View 不知道 _myObject 的变化,因此不会在 _myObject 变化时更新。我想到的几种方法。
我还没有测试过将我的实体包装在
INotifyPropertyChanged包装类中,但我很谨慎,因为我有很多实体对象。我可以为所有属性调用
OnPropertyChanged("..."),但是我的一些实体有很多属性,这会很丑。可以使用反射使其更干净,但我可能有未绑定数据的属性。我也许可以将此推迟到 UI,当我单击“下一个记录”时以某种方式刷新绑定,但这会破坏 MVVM 并且看起来很脏
如何让 UI 识别来自 _myObject 的更改?
【问题讨论】:
-
从 _nextRecord() 中手动调用 OnPropertyChanged 怎么样?
-
@Wiktor
NextRecord不是真正的方法,我只是想隐藏获取 next 记录的实现细节,因为它们对于问题并不重要。但你所说的本质上是我的第二种方法。问题在于,说 15-20 个属性是不可扩展的,您需要调用OnPropertyChanged15-20 次 -
那又怎样?这就是真正发生的情况,一个对象被另一个对象替换,这意味着 20 个属性发生了变化,因此需要刷新 20 个 ui 组件。绑定没有魔法,如果某个地方有人没有触发更新,什么都不会发生。
-
@Wiktor 我不关心性能。看到 20 次对
OnPropertyChanged的调用很难看,而且您必须记住在属性更改时更新/更改。我想我可以利用反射来解决这个问题,但还没有测试过。 -
可能。恕我直言,最干净的解决方案是反映如果您切换到另一条记录,视图模型会发生变化的事实。这意味着没有内部的隐藏替换。相反,您在新模型上重新创建视图模型并完全重新绑定 ui。
标签: c# wpf entity-framework mvvm data-binding