1

我的问题可能需要几个答案或一个很好的例子我可能会做错事,我感谢任何帮助。

本质上,我正在尝试将 WPF 表单绑定到我的实体框架工作模型,同时我正在尝试为我的 WPF 表单学习 MVVM,因此应该有很多示例已经使用了很多来获得我的位置,但我不能找一个把它钉在一起,无济于事,我对 c# 的熟练程度不足以阅读它,我必须一直把它放在翻译器上。

-

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

Public Property IsSelected As Boolean
Public Property IsReadOnly As Boolean

和所有其他人......

但是,我还希望实体框架工作上下文来跟踪我的实体,因此这些实体上的导航属性仍然​​有效,我可以调用 SaveChanges ...如果我有新类,这似乎不起作用。
这就是它的症结所在,我无法弄清楚我是如何让 EF 和 MVVM 很好地结合在一起的。

我唯一能想到的就是用我的实体之一作为私有创建一个类,然后手动重新创建所有属性,但这肯定是继承的重点。

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 和各种只是一团糟。

谢谢蒂姆

旁注我是初学者,我似乎无法找到一种优雅的方式来使用父对象或使用子对象的父对象来构造子类,我似乎必须通过所有对象属性,这真的对吗?

4

3 回答 3

0

MVVM 中缺少的一件事是 ViewModel。

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

例如,您可以有一个 ObservationViewModel,它公开一个观察列表和一个 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

然后在您的视图中将观察和选定的观察绑定到您的 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}" />
于 2013-04-22T20:59:23.227 回答
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 更改为实体框架中调用的任何实体。

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

于 2014-01-29T17:19:51.177 回答
0

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

于 2013-04-22T21:01:59.417 回答