2013-04-22 310 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命令並從保存按鈕中調用它,或者您想要連接它。