ライブビューは双方向に更新可能です。1つめは、ベースデータからビュー方向への更新です。ベース(ソース)データは変更されることがあり、ビューは自動的に更新されて、変更後のベースデータと同期されます。この機能により、ビューはライブになります。2つめは、その逆方向への更新です。データはビューで直接変更されることがあります。この更新は、プログラムを使用して(ViewRow を使用)実行することができます。また、データ連結を使用して実行することもできます。グリッドなどの GUI コントロールをビューに連結している場合は特に、ビューで直接データを更新することが普通です。
ビューでデータを直接変更できる場合は、そのビューを "更新可能" と呼びます。この用語は、2つめの方向のデータ更新だけを対象にします。1つめの方向のデータ更新(ベースデータの更新)は、どのライブビューでも制限なく可能です。このため、ビューが "更新可能" ではない("読み取り専用" である)と言う場合でも、そのビューのデータが変化しないという意味ではありません。LiveLinq のすべてのビューはライブであり、ベースデータに加えられた変更は自動的にビューに反映されます。したがって、これは、ビューでは直接データを変更できず、データを修正するにはベースデータを変更する必要があるという意味に過ぎません。
すべてのライブビューが更新可能なわけではありません。さらに、ビュー全体が更新可能でも、一部のプロパティが読み取り専用である場合があります。これらは、ビューのソースデータ内のプロパティに直接対応していないプロパティです。結局のところ、ビューの更新とは、ビューのベースデータ、つまりビューのソースのいずれか1つを更新することを意味します。これは、ビュー自体は仮想の存在で、ビューに独自のデータはなく、ソースのデータを(フィルタ処理および形成して)表示しているに過ぎないからです。このため、ビューフィールド(プロパティ)は、ソース内のプロパティと直接対応させることが可能な場合にのみ、更新することができます。たとえば、次のビューを考えます。
C# |
コードのコピー
|
---|---|
for c in customers where c.City == "London" select new { c.City, c.CompanyName, FullName = c.FirstName + " " + c.LastName } |
City と CompanyName は、customers ソースの City フィールドと CompanyName フィールドに直接対応しているため、更新可能です。一方、FullName は更新可能ではありません。これは、ソースには FullName に対応する単一のフィールド(プロパティ)がなく、FullName が2つのソースプロパティの組み合わせだからです。
ビューの更新(ビュー項目の追加、削除、変更)は、ビューのソースのいずれか1つで対応する操作(単一項目の追加、削除、変更)を実行することによって行われます。通常、操作の影響は明らかであり、意図したとおりのことが行われますが、この単純なルールを知り、正確に理解することは必要です。それは、このルールを考慮しないと、予期しない結果になることがあるためです。たとえば、前述のビューで、City の値が "London" 以外になるように項目を変更すると(または新しい項目を追加すると)、その項目はビューから消えます。
ビュー項目を更新することは、ビューのソースのいずれか1つで項目を更新することと同じであるというルールを上で述べました。これは、ビューのソースのいずれか1つだけが更新可能であるということを意味しています。結合ビューには2つのソースがあるので、どちらのソースを更新可能にするかを決定する必要があります。デフォルトでは、結合ビューは読み取り専用です。この2つのソースの一方を更新可能にする場合は、拡張メソッド AsUpdatable() を使用します。たとえば、次のように指定します。
C# |
コードのコピー
|
---|---|
for o in orders.AsUpdatable() join c in customers on o.CustomerID equals c.CustomerID select new { o.OrderDate, o.Amount, c.CompanyName } |
ここでは、注文データ(日付と金額)は更新可能で、顧客データ(CustomerName)は読み取り専用になります。
ビューが更新可能かどうかを確認するには、プロパティ View.IsReadOnly を使用します。データ連結およびプログラムからアクセス可能なビューのすべてのプロパティを、更新可能性を含むすべての情報と合わせて取得するには、プロパティ ViewRowCollection.Properties を使用します。
コードでビューのデータを直接更新するには、特別なクラス ViewRow を使用します。これは、プログラムからのアクセスやデータ連結に使用されるビュー項目を表すビュー行です。このクラスをコードで使用する方法については、ViewRowCollection および ViewRow のリファレンスドキュメントを参照してください。