Sho*_*hoe 4 c# data-binding wpf entity-framework mvvm
我试图想出一个使用Entity-Framework实现MVVM模式的好方法,其中我的实体是我的模型.我DataContext
是我的观点模型.这是一个小问题的再现.
视图
<TextBox Text="{Binding MyText}" />
Run Code Online (Sandbox Code Playgroud)
ViewModel:
我需要从我的数据库中按记录导航记录.在View中单击按钮时,会将命令发送到执行的Viewmodel 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
}
}
Run Code Online (Sandbox Code Playgroud)
自动生成实体模型
public partial class MyEntityObject
{
public string MyText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
由于View不知道_myObject
更改,因此_myObject
更改时不会更新.我想到的一些方法.
我没有测试在INotifyPropertyChanged
包装类中包装我的实体但是我很谨慎,因为我有很多实体对象.
我可以调用OnPropertyChanged("...")
所有属性,但我的一些实体有很多属性,这将是丑陋的.可以使用反射使其更清晰,但我可能具有不是数据绑定的属性.
我可以将这个推迟到用户界面,当我点击"下一个记录"时,以某种方式刷新绑定,但这打破了MVVM并且看起来很脏
如何让UI识别来自的变化_myObject
?
正如我在评论中提到的,调用OnPropertyChanged("")
或OnPropertyChanged(null)
使所有属性无效,相当于调用OnPropertyChanged
每个属性.此行为也在此处记录:
PropertyChanged事件可以通过使用null或String.Empty作为PropertyChangedEventArgs中的属性名称来指示对象上的所有属性都已更改.
这意味着您可以OnPropertyChanged("")
在更新对象时简单地添加一个调用,以强制WPF重新评估视图模型的所有绑定:
private void _nextRecord()
{
_myObject = myEntitiesContext.NextRecord();
OnPropertyChanged("");
}
Run Code Online (Sandbox Code Playgroud)
话虽这么说,我仍然会使用@Anand的解决方案(+1).关于viewmodel是否可以将模型公开为属性是一件正在进行的争论,我倾向于将它暴露出来,直到你需要引入一些特定于视图模型的逻辑.大部分时间你都不需要,并且不值得包装模型属性.