1


1

XmlDataProvider.SourceをMVVMプロパティにバインドする方法

https://stackoverflow.com/questions/188001/two-way-binding-of-xml-data-to-the-wpf-treeview [この例]に従って `XmlDataProvider`にバインドされたツリービューを持っています。 私が取り組んでいるアプリはMVVMパターンに従っており、Xmlはユーザーが開くファイルからのものです。

`XmlDataProvider`のSourceプロパティを次のようにバインドしようとすると


「バインディングは、DependencyオブジェクトのDependencyPropertyにのみ適用できます」というメッセージが表示されます。または何か。

したがって、バインディングを手続き的に組み合わせるのではなく、「XmlDataProvider」「Source」を宣言的にバインドする方法がありますか? データプロバイダーを放棄して、ツリーを直接 `XmlNode`プロパティにバインドしようとすると、XmlオブジェクトでのみXPathバインディングを使用することに関するエラーが発生します。私にはまったく意味がありませんが、何か重要なことを伝えようとしていると確信しています。

3 Answer


3


答えは次のように見えます:できません。

方程式から `XmlDataProvider`を削除し、TreeViewをXmlNodeを返すViewModelプロパティに直接バインドすることで、根本的な問題(ツリービューをXMLドキュメントにバインドする)を解決できました。

私をつまずかせたのは、 `XmlDataProvider`を指すバインディングコードを取得し、自分のプロパティを指すようにし、XPath引数をそのまま残したことです。


これにより、ランタイムエラーが発生します。 `System.Windows.Data Error:44:BindingExpression with XPath cannot bind to non-XML object .; XPath = '。' `

これは最も役に立ちませんでした。 本当に言おうとしていたことは、 XmlNode`プロパティにバインドできず、バインドで XPath`引数を提供できないということです(XmlDataProviderがそれをどう処理するのかを知っているからですか??)。



2


実際、それは私にとってかなり難しい問題でした。アプリが一時ファイルからツリービューをロードする必要があったためです。また、アプリケーションの場所が異なる場合、XmlDataProvider Sourceプロパティに厳密なリンクを設定できません。

ソースをプロジェクトにリソースとして追加

私が見つけた解決策は、一時ファイル(マークアップはXAML経由で作成されます、以下を参照)をプロジェクトに追加し、ビルドアクションを「コンテンツ」に設定するため、アプリケーションは「を含むオブジェクトでXmlDataProvider`とツリービューの更新。


TreeViewは次のようにバインドされます。


たぶんこれは誰かを助けるでしょう


1


ソースをすぐにバインドする方法が見つかりませんでしたが、次のようにコードビハインドでXmlDataProviderソースを変更できます。

var xdp = (XmlDataProvider)this.Resources["key-of-your-XmlDataProvider-in-resources"];
xdp.Source = new Uri("http://url-of-your-xml");

これをイベントハンドラと組み合わせてバインドできます。