1

私の質問には、いくつかの回答が必要な場合や、すべてが間違っている可能性がある良い例が必要な場合があります。

本質的には、WPF フォームをエンティティ フレーム作業モデルにバインドしようとしています。同時に、WPF フォームの MVVM を学習しようとしています。それを一緒に固定しているものを見つけてください。私はそれを読むのに十分なC#に習熟していません。常に翻訳者に通さなければなりません。

-

ビューモデルが必要とする追加のプロパティをホストするために、エンティティの 1 つから継承された新しいクラスを作成する必要があると思います

Public Property IsSelected As Boolean
Public Property IsReadOnly As Boolean

そして他のすべて...

ただし、Entity Frame Work コンテキストでエンティティを追跡したいので、それらのエンティティのナビゲーション プロパティは引き続き機能し、SaveChanges を呼び出すことができます...新しいクラスがある場合、これは機能しないようです。
そして、それが重要な点です。EF と MVVM をうまく連携させる方法がわかりません。

私が考えられる唯一のことは、エンティティの1つをプライベートとしてクラスを作成し、すべてのプロパティを手動で再作成することですが、これは継承のポイントです。

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

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 を、Entity Framework でエンティティが呼び出されるものに変更します。

次に、ViewModel に SaveChanges コマンドを追加し、保存ボタンから呼び出すか、任意の方法で呼び出します。

于 2014-01-29T17:19:51.177 に答える
0

私が理解している場合は、ViewModel を介してモデルのみをビューの DataContext にバインドしようとしています。そのため、モデルにビュー管理プロパティを追加しようとしていますが、これは間違っています。モデルはビューモデルを介してビューにバインドできるものの一部にすぎません。必要なことは、ViewModel オブジェクト自体をビューの DataContext にバインドすることです。
エンティティ フレームワークは、アプリとデータベースの間の一種のデータ レイヤーです。Entity Framework を使用するよりも、まず MVVM をマスターする必要がある場合があります。

于 2013-04-22T21:01:59.417 に答える