| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
280 バイト追加 、 2020年2月16日 (日) 04:34
編集の要約なし
==[[WPF データ]]==
[[WPF]] | [[.Net]] | [[Silverlight]] | [[Universal Windows Platform]] | [[C Sharp]] |
{{amazon|4798114200}}
*http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html
==データの原則==
===[[.NETデータモデルNET]]データモデル===
*"データモデル"は、データの提供元と、利用者の間の取り決めを記述する
*[[.NETの登場により、データモデルはAPIに固有のものから、フレームワーク全体で共通したものへと変化NET]]の登場により、データモデルはAPIに固有のものから、フレームワーク全体で共通したものへと変化*WPFのすべてのデータ操作は、基盤である、[[.NETデータモデルに基づいているため、WPFコントロールでは任意のCLRオブジェクトからデータを取得することが可能NET]]データモデルに基づいているため、WPFコントロールでは任意のCLRオブジェクトからデータを取得することが可能*CLRを通じてアクセス出来るかぎり、WPFで視覚化することが可能CLRを通じてアクセス出来るかぎり、[[WPF]]で視覚化することが可能
===バインディングの多用===
*バインディングがシステム全体で統合されている
**リソースはリソースバインディングを通じてロード
**コントロールもデータバインディングに大きく依存するコンテンツモデルに基づいている
<blockquote>データソースにプロパティをバインドし、依存関係を追跡「、表示を自動的に更新するという概念はWPFのすべての部分に共通データソースにプロパティをバインドし、依存関係を追跡「、表示を自動的に更新するという概念は[[WPF]]のすべての部分に共通</blockquote>
===データ変換===
*バインディングが多用されるフレームワークでは、データへのアクセスは、変換可能な場合にのみ可能となる
*WPFは2種類の主要な変換、値変換とデータテンプレートをサポート[[WPF]]は2種類の主要な変換、値変換とデータテンプレートをサポート
**値コンバータは、値の形式変換を行う。コンバーターは変換前後、どちらの形式でも受け取り変換可能(データの双方向変換)
**データテンプレートを使用すると、データを表現するためのコントロールをその場で作成できる
==リソース==
*一般に、表示とデータの分離に最初に遭遇するのは、リソースを使用するとき
*すべての要素には、Resourcesプロパティがあるすべての要素には、[[R]]esourcesプロパティがある*Resourcesプロパティは単純なディクショナリで、リソースはキーを通じた単純な階層型参照を提供[[R]]esourcesプロパティは単純なディクショナリで、リソースはキーを通じた単純な階層型参照を提供
*テーマ、スタイル、データバインディングはいずれもこのテクニックを利用している
=====[[C#]]でコードを記述=====
*後で使用する変数を簡単に定義できる
public class Window1 : Window {
}
=====マークアップ=====
*名前付きオブジェクトのリストを保持できる共通のプロパティ(Resource[[R]]esource)を任意の子要素で使用できる
*参照は階層的に行われ、要素の親に変数が含まれてない場合、その親、次の親へとたどる
<Window
Text ="Resource[[R]]esource"
...>
<Window.Resource[[R]]esource>
<SolidColorBrush x:Key="toShare">Yellow</SolidColorBrush>
</Window.Resource[[R]]esource> <Button Background="{StaticResource Static[[R]]esource toShare}">
</Button>
</Window>
|
|-
|Application.Resource[[R]]esource
|
|-
===バインディングの基本===
*"バインディング"とは、2つのデータポイントの同期を保つこと。
*WPFではBindingクラスがデータポイントを表します。[[WPF]]ではBindingクラスがデータポイントを表します。
*バインディングを構築するには、このクラスにソース(データソース)とパス(クエリ)を渡す
===={x:Bind} マークアップ拡張====
*https://msdn.microsoft.com/ja-jp/library/windows/apps/mt204783.aspx
<blockquote>[[Windows ]] 10 では、{Binding} に代わり、{x:Bind} マークアップ拡張が新たに提供されています。{x:Bind} では、{Binding} の機能のいくつかが省略されていますが、{Binding} よりも短い時間および少ないメモリで動作し、より適切なデバッグをサポートしています。</blockquote>
*XAML の読み込み時、{x:Bind} は、バインディング オブジェクトと考えることのできるオブジェクトに変換され、このオブジェクトがデータ ソースのプロパティから値を取得します。
*{x:Bind} と {Binding} によって作成されたバインディング オブジェクトは、ほとんど機能的に同等
*{x:Bind} は、コンパイル時に生成される特定用途のコードを実行し、{Binding} は、汎用的なランタイム オブジェクト検査を実行します
*{x:Bind} バインディング (多くの場合、コンパイル済みバインドと呼ばれます) はパフォーマンスが高く、コンパイル時にバインド式を検証したり、ページの部分クラスとして生成されたコード ファイル内にブレークポイントを設定し、デバッグを行ったりできます
<blockquote>これらのファイルは obj フォルダー内にあり、<view [[vi]]ew name>.g.cs (C# の場合) などの名前が付けられています</blockquote>
Path="Text">
<Binding.Converter>
<l:HumanConverter xmlns:l="clr-namespace:EssentialWPFEssential[[WPF]]"/>
</Binding.Converter>
</Binding>
*独自の型に対するテンプレートを構築し、データをプロパティにバインド
<DataTemplate
xmlns:l="clr-namespace:EssentialWPFEssential[[WPF]]"
DataType="{x:Type l:Human}">
<Border Margin="5" Padding="5" BorderBrush="Black"
BorderThickness="3" CornerRadiusCorner[[R]]adius="5">
<TextBlock Text="{Binding Path=Name}" />
</Border>
<ContentControl.ContentTemplate>
<DataTemplate
xmlns:l="crl-namespace:EssentialWPFEssential[[WPF]]"
DataType="{x:Type l:Human}">
...
</ContentControl.ContentTemplate>
</ContentControl>
=====WPFでは環境データコンテキストを要素に関連付けることができる[[WPF]]では環境データコンテキストを要素に関連付けることができる=====
*上記例では、バインディングのデータソースが指定されていない
<TextBloxk Text="{Binding Path=Name}" />
*任意の要素でDataContextプロパティを明示的に設定することが可能
*そのデータソースが当該の要素およびその子すべてのバインディングに使用される
===CLRオブジェクトへのバインディングCL[[R]]オブジェクトへのバインディング===*CLRオブジェクトへのデータのバインドは、プロパティおよびリスト(IEnumerableを実装する任意の型[[IE]]numerableを実装する任意の型)を通じて行う
*バインディングは、ソースとターゲットの間の関係を確立する
*オブジェクトバインディングの場合、ソースに選択される項目は、プロパティパスによって決まる
*プロパティパスはドットで区切られた名前付きプロパティまたはインデックス
====オブジェクトバインディングのプロパティ名の識別子====
*単純なCLRプロパティ用単純なCL[[R]]プロパティ用*WPFのDependencyPropertyベースのプロパティ用[[WPF]]のDependencyPropertyベースのプロパティ用
=====TextBoxのTextプロパティを別のTextBoxにバインド=====
*次の例と同じ
*クラス修飾形式のプロパティ識別子を使用
*CLRリフレクションを使用してバインディング式内のTextという名前を解決する処理を行わないCL[[R]]リフレクションを使用してバインディング式内のTextという名前を解決する処理を行わない
**リフレクションを使用することによるパフォーマンスへの影響を回避
**添付プロパティへのバインディングが可能になる(TextBoxオブジェクトのGrid.Row [[R]]ow プロパティにバインドする場合、{Binding Element Name=text1, Path=(Grid.Row[[R]]ow)} のようにする)
<Window
xmlns="..."
|-
|INotifyPropertyChangedを実装する
|[[.NET2NET]]2.0で導入、データバインディングのシナリオに最適化、通常変更通知シナリオにはいくぶん大げさだが、一般にデータモデルを作成する場合、賢明な選択
|-
|変更をプロパティに報告するイベントを追加する
|.NET1.0で導入。Windows Forms [[ASP.NETのデータバインディングでサポートNET]]のデータバインディングでサポート
|-
|DependencyPropertyベースのプロパティを作成する
|使用は比較的簡単。このプロパティをしy法すると、sparse storage を保持したり、WPFのほかのサービスに接続したりすることが可能となる。DependencyObjectからの派生が必須となってしまうを保持したり、[[WPF]]のほかのサービスに接続したりすることが可能となる。DependencyObjectからの派生が必須となってしまう
|-
|}
}
public enum NotifyCollectionChangedAction {
Add,Remove[[R]]emove,Replace[[R]]eplace,Move,Reset[[R]]eset,
}
*もっとも簡単な方法は、INotifyCollectionChangedINotifyCollectionChanged をサポートするObservableCollection<T>を使用すること
:
<StackPanel.Resources[[R]]esources>
<!-- 住所のリストを表示するためのテンプレート -->
<DataTemplate x:Key="addressTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Zip}"/>
<TextBlock Text="{Binding Path=ProvincePro[[vi]]nce}"/>
<TextBlock Text="{Binding Path=City}"/>
<TextBlock Text="{Binding Path=Street}"/>
</StackPanel>
</DataTemplate>
</StackPanel.Resources[[R]]esources>
:
<!--住所のリスト -->
<ListBox ItemSource="{Binding Path="Addresses}"
ItemTemplate="{DynamicResource Dynamic[[R]]esource addresTemplate}" />
:
===XMLへのバインディング[[XML]]へのバインディング===*WPFのXMLサポートは、SystemWPFの[[XML]]サポートは、System.Xml名前空間で提供されるDOMを基盤としている
*任意のXmlDocument、XmlElement、XmlNodeをソースとして使用することができる
*プロパティは要素の属性またはコンテンツにのみあバインドできる
*リストは任意の要素セットにバインドできる
====XPathの基本[[XPath]]の基本====*WPFのバインディングは大きくXPathに依存しているWPFのバインディングは大きく[[XPath]]に依存している
<Media>
<Book Author="a1" Title="t1"/>
<Book Author="a2" Title="t2"/>
<Book Author="a3" Title="t3"/>
*XPathによって、ノードのリストまたは単一のノードが生成されるという考え方はXMLバインディングを学ぶ上で極めて重要[[XPath]]によって、ノードのリストまたは単一のノードが生成されるという考え方はXMLバインディングを学ぶ上で極めて重要*XMLでは要素の属性の両方がXMLノードとみなされる[[XML]]では要素の属性の両方が[[XML]]ノードとみなされる*XPathは実際には要素だけでなくノードを選択することによって機能する[[XPath]]は実際には要素だけでなくノードを選択することによって機能する
*属性名を参照するには 「@」を演算子を使用する
** Media/Book/@Title を使用すると、次の内容が返る(XmlAttributeNode型)
{|class="wikitable"
![[XPath]]
!説明
!例
|-
|}
====XMLバインディング[[XML]]バインディング====
=====バインディングを使用しない例=====
XmlDocument doc = new XmlDocument();
=====バインドを使用する=====
*バインディングを使用すると変更を追跡できる
*XmlDataProviderオブジェクトを更新、変更するとListBoxが自動的に更新されるXmlDataPro[[vi]]derオブジェクトを更新、変更するとListBoxが自動的に更新される
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"
</DVD>
</Media>");
XmlDataProvider XmlDataPro[[vi]]der dataSource = new XmlDataProviderXmlDataPro[[vi]]der();
dataSource.Document = doc;
Binding bind = new Binding();
bind.Source = dataSource;
bind.[[XPath ]] = "/Media/Book/@Title";
ListBox list = new ListBox();
list.SetBinding(ListBox.ItemSourceProperty, bind);
=====マークアップ=====
*XmlDataProviderXmlDataPro[[vi]]der**XmlDocumentオブジェクトを構築してXPathを適用するためのマークアップフレンドリーな方法XmlDocumentオブジェクトを構築して[[XPath]]を適用するためのマークアップフレンドリーな方法
**データソースに対してフィルタリングを直接実行できる
**XMLデータをデータソースに移動するための一般的な方法[[XML]]データをデータソースに移動するための一般的な方法**多くの場合、XmlDataProviderを使用せずに、XmlDocument、XmlElementオブジェクトをバインディングソースとして直接使用できる多くの場合、XmlDataPro[[vi]]derを使用せずに、XmlDocument、XmlElementオブジェクトをバインディングソースとして直接使用できる
<Window
:>
<Window.Resource[[R]]esource> <XmlDataProvider XmlDataPro[[vi]]der x:Key="dataSource">
<x:XData>
<Media xmlns=''>
</Media>
</x:XData>
</XmlDataProviderXmlDataPro[[vi]]der> </Window.Resource[[R]]esource>
:
<ListBox ItemSource = "{Binding [[XPath]]=/Media/Book/@Title}, Source={StaticResource dataSource}"/>
=====データソースを動的に判断する=====
*データソースを(動的リソース参照を使用、またはデータソースを判断するためのバインディングを通じて)動的に判断する必要がある場合は、DataContextプロパティを使用できる
<Window
:
DatraContext="{DynamicResource Dynamic[[R]]esource dataSource}"> <Window.Resource[[R]]esource> <XmlDataProvider XmlDataPro[[vi]]der x:Key="dataSource">
<x:XData>
<Media xmlns=''>
</Media>
</x:XData>
</XmlDataProviderXmlDataPro[[vi]]der> </Window.Resource[[R]]esource>
:
<ListBox ItemSource = "{Binding [[XPath]]=/Media/Book/@Title}" />
===データテンプレート===
*データテンプレートを使用するとデータの表示方法を定義できる

案内メニュー