将实体绑定到WPF表单MVVM

时间:2013-04-22 20:47:43

标签: wpf vb.net entity-framework mvvm

我的问题可能需要几个答案或一个很好的例子,我可能会对所有错误的事情进行讨论,我感谢任何帮助。

本质上我试图将WPF表单绑定到我的Entity Frame工作模型,同时我正在尝试为我的WPF表单学习MVVM,所以应该有大量的示例使用很多来获取我的位置但是我找不到把它固定在一起,并没有帮助我在c#中不够精通阅读它我必须一直把它作为翻译器。

-

我想我需要创建一个继承自我的某个实体的新类,以托管我的视图模型需要的额外属性

Public Property IsSelected As Boolean
Public Property IsReadOnly As Boolean

以及所有其他人......

但是,我还想要实体框架工作上下文来跟踪我的实体,所以那些实体的导航属性仍然​​可以工作,我可以调用SaveChanges ...如果我有新的课程,这似乎不起作用。
这就是它的关键所在我无法弄清楚我如何让EF和MVVM很好地融合在一起。

我唯一能想到的就是创建一个类,其中一个Entity作为Private,并手动重新创建所有属性,但这肯定是继承点。

Class Observation_View
Private Co_Observations_TBL as Observations_TBL

Public New (ByVal Observation as Observations_TBL)
Co_Observations_TBL = Observation 
End Sub

Public Property Observed_Value as Single
 Get
  Return Co_Observations_TBL.Observed_Value  
 End Get
 Set
  Co_Observations_TBL.Observed_Value =  value
  RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Observed_Value"))
 End Set
End Property

(我可能需要在构造函数中使用上下文注册实体。)

感觉就像我不应该这样做的方式,我必须重新实施PropertyChanged,所有种类只是一团糟。

由于 添

另外注意我是初学者,我似乎找不到使用父对象或父母使用孩子构建子类的优雅方式,再次我似乎必须通过所有对象属性,这是真的正确?

3 个答案:

答案 0 :(得分:0)

您的MVVM中缺少的一件事是ViewModel。

基本上你需要创建一个ViewModel然后公开属性。这些属性是模型中的对象。然后,将xaml-page的DataContext设置为该ViewModel的实例。您可以在构造它时从构造函数或其他任何位置加载要显示的对象。

例如,您可以使用ObservationViewModel公开Observations列表和SelectedObservation:

Public Class ObservationViewModel

    Public Property Observations As IEnumerable(Of Observation)
    ' implement the property and raise PropertyChangedEvent here in the setter (omitted for brevity)

    Public Property SelectedObservation as Observation
    ' implement the property and raise PropertyChangedEvent here in the setter (omitted for brevity)    
End Class

然后在您的视图中将Observations和选定的观察结果绑定到ViewModel:

<ListBox ItemsSource="{Binding Observations}" SelectedItem="{Binding SelectedObservation, Mode=TwoWay}" />

要将更改保存到数据库,请使用命令。您在ViewModel(上面显示的类)中声明一个命令,如下所示:

 ' Note: to use RelayCommand you should add an MVVM-framework such as MVVM Light
 Public Property SaveCommand as New RelayCommand(
     Sub()
         ' Save the list of objects that have changed here
     End Sub()
 )

之后,你可以在XAML中绑定一个保存按钮,如下所示:

<Button Command="{Binding SaveCommand}" />

答案 1 :(得分:0)

如果我理解,你试图通过ViewModel仅将Model绑定到View的DataContext。这就是为什么你试图在模型中添加视图管理属性,这是错误的。 一个Model只是可以通过ViewModel绑定到View的东西的一部分。您需要做的是将ViewModel对象自身绑定到View的DataContext。实体框架是应用程序和数据库之间的一种数据层。您可能需要首先掌握MVVM而不是实体框架

答案 2 :(得分:0)

我发现将您的EF集合放入ObservableCollection是最简单的方法,并为您的WPF绑定实现INotifyPropertyChanged和INotifyCollectionChanged。

Dim _dbcontext as New EntityFrameworkEntities
Dim _PrivateCollection as ObservableCollection(Of T)

Public Property Collection as ObservableCollection(Of T)
  Get 
    Return _PrivateCollection
  End Get
  Set(value as ObservableCollection(Of T))
    [Insert Validation Here]
    _PrivateCollection = Value
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Collection"))
  End Set
End Property

然后确保在构造函数中填充您的集合,并添加处理程序以添加或删除实体框架中的对象。

Public Sub New()
  _PrivateCollection = New ObservableCollection(Of T)(dbcontext.EFCollectionName.ToList)
  AddHandler Collection.CollectionChanged, AddressOf OnEFCollectionChanged
End Sub

Public Event CollectionChanged(Sender as Object, e As NotifyCollectionChangedEventArgs) Implements INotifyCollectionChanged.CollectionChanged

Private Sub OnEFCollectionChanged(Sender as Object, e as NotifyCollectionChangedEventArgs)
  If e.Action = NotifyCollectionChangedAction.Add Then
    For Each Item In e.NewItems
      dbcontext.EFCollectionName.Add(Item)
    Next
  End If
  If e.Action = NotifyCollectionChangedAction.Remove Then
    For Each Item In e.OldItems
      dbcontext.EFCollectionName.Remove(Item)
    Next
  End If
End Sub

显然,将Private Collection和Collection名称更改为您希望它们被调用的任何名称。然后将EFCollectionName更改为在Entity Framework中调用实体的任何内容。

现在只需在ViewModel中添加SaveChanges命令,然后从保存按钮调用它,或者您想要连接它。