2013-04-22 127 views
1

我的问题可能需要几个答案或一个很好的例子,我可能会谈论所有错误的东西,我感谢任何帮助。将实体绑定到WPF表单MVVM

实质上,我试图将一个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和所有排序只是一团糟。

感谢 添

侧面说明我是一个初学者,我似乎无法找到使用父对象或父母用孩子构建一个子类的一个优雅的方式,再次我似乎必须通过所有的对象属性,这是真的吗?

+0

乍一看,尝试将您的Observations_TNL实体作为“ByRef”传递。我相信应该解决你的更改跟踪问题。 – ChrisO 2013-04-22 21:02:08

回答

0

MVVM中缺乏的一件事就是ViewModel。

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

例如,你可以有暴露观察名单和SelectedObservation的ObservationViewModel:

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 

然后在您的视图您绑定的意见和选择的观察到您的视图模型:

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

要保存对数据库的更改,请使用命令。您在您的视图模型(上面显示的类)这样声明的命令:

' 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}" /> 
+0

我觉得'Observation_View'是他的viewmodel。 – ChrisO 2013-04-22 21:00:30

+1

嗯,是的,我想,但在他的ViewModel中,他再次暴露了所有的属性。如果他只是实现在他的模型中更改的INotifyProperty,那不是必需的 – Kenneth 2013-04-22 21:02:39

+0

我想我同意你的观点,我正在尝试创建一个View Model。在这个视图模型中,我想要一个观察对象的集合,让我的视图绑定到某个东西,这是我认为你告诉我的。然而,来自我的实体框架工作模型的Observation_TBL对象不会完成这项工作,它需要为视图对象定制更多的属性,例如IsSelected属性,这显然我不想在实体框架中工作。 所以我正在努力设计的观察对象,使实体框架工作将追踪它,并且它具有额外的特性。 谢谢 蒂姆 – Timmyg 2013-04-23 09:36:13

0

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

+0

TBH我在EF比EFF好得多,我所有的用户界面,直到现在已经被写成像Win Forms应用程序一样粗糙的东西。我可以通过在我的实体的部分类中添加属性(我没有先使用代码),从而创建出实体的视图模型。但我相信这也不是它的意图。 – Timmyg 2013-04-23 09:41:47

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 

很明显,将私人收藏和收藏名称更改为任何您希望他们被调用。然后将EFCollectionName更改为实体框架中调用的实体。

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