私の最初の実際のWPFアプリケーション(つまり、私以外の誰かが最初に使用することを意図したもの)を構築中です。 WPFでの作業を行う最善の方法です。これは、かなり新しいEntity Frameworkを使用したかなりシンプルなデータアクセスアプリケーションですが、私はこれらの2つのテクノロジ(WPFとEF)を一緒に使用するための最善の方法をオンラインで多く見つけることができませんでした。そこで私はどのように近づいているのかを捨てて、誰かがより良い提案をしているかどうかを見極めることを考えました。WPFデータバインディングでEntity Frameworkを使用するためのベストプラクティス
は、私はSQL Server 2008のEFは、両方はるかに、それは必要以上に複雑で、まだ成熟していないが、LINQのツーSQLは明らかに死んでいるように私を打つとEntity Frameworkのを使用しています私は、MSが重点を置いていると思われる技術を使用するかもしれない。
これは単純なアプリケーションなので、別のデータレイヤーを構築するのには適していません。私はデータを取得したい場合は、私はかなり単純なLINQのツーエンティティクエリを使用し、通常ストレート私のコードビハインドから、例えば:
var families = from family in entities.Family.Include("Person") orderby family.PrimaryLastName, family.Tag select family;
LINQのツーエンティティクエリはdoesnのIOrderedQueryable結果を返しますエンティティデータモデルにコードを介して新しいレコードを追加すると、この新しいレコードの存在はLinqクエリを参照するさまざまなコントロールに自動的に反映されません。したがって、私は、基礎となるデータ変更を取得する、のObservableCollectionにこれらのクエリの結果を投げています:
familyOC = new ObservableCollection<Family>(families.ToList());
私はなど、ソート、フィルタリングを得ることができるように、私は、その後、CollectionViewSourceにのObservableCollectionをマッピングし、データベースに戻る必要はありません。
familyCVS.Source = familyOC; familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter); familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending)); familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending));
私は、そのCollectionViewSourceにさまざまなコントロールをバインドし、どのような-ない:
<ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5" Name="familyList" ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource familyTemplate}" SelectionChanged="familyList_SelectionChanged" />
私は、レコード/オブジェクトを追加または削除する必要があるとき、私は手動でエンティティデータの両方から行いますモデル、およびのObservableCollection:
private void DeletePerson(Person person) { entities.DeleteObject(person); entities.SaveChanges(); personOC.Remove(person); }
私は一般のStackPanelとDockPanelを使用していますが要素を配置するように制御します。グリッドを使用することもありますが、維持するのは難しいようです。グリッドの上部に新しい行を追加する場合は、グリッドによって直接ホストされるすべてのコントロールをタッチして、新しいラインを使用するように指示する必要があります。 Uggh。 (マイクロソフトではDRYのコンセプトを実際には見たことがありません)
VS WPFデザイナーを使用してコントロールを追加、変更、または配置することはほとんどありません。 VSに付属しているWPFデザイナーは、あなたのフォームがどのように見えるかを知るのに漠然と役立ちますが、実際にはそうではありません。特に、利用可能なデータにバインドされていないデータテンプレートを使用している場合デザインタイム。 XAMLを編集する必要がある場合、私はそれを人のように取り、手動で行います。
実際のコードのほとんどは、XAMLではなくC#です。私がelsewhereを言及したように、私がまだそれを "考える"ことに慣れていないという事実を除いて、XAMLは、醜い、醜い言葉として私を襲ってしまい、デザイナーやインテリセンスの貧弱なサポートにもなります。デバッグできません。 Uggh。その結果、C#コードビハインドで何かを行う方法を明確に見ることができるときは、XAMLのやり方を簡単に見ることができないので、C#でやっています。WPFページでコードビハインドをほとんど使用しない(イベント処理のために)コードビハインドを使用することはほとんどありませんが、少なくとも私にとっては意味がありません。 C#のようなきれいでクリーンな言語を使用することができ、世界レベルのエディタに近い完璧なエディタを使用することができるときに、なぜ神秘的な構文、驚くほど悪いエディタ、および実質的に型の安全性がない、醜い、インテリセンス、比類のないタイプの安全性?
これは私の所です。助言がありますか?私はこれの大きな部分を欠いていますか?違うやり方について本当に考えなければならないことは何ですか?
vs2010/fw4.0:ItemsSourceはfamilyCVS.View(familyCVSではなく)にバインドする必要があります。 –