2

XmlDataProvider次のthis exampleにバインドされたツリービューがあります。私が取り組んでいるアプリはMVVMパターンに従っており、Xmlはユーザーが開くファイルからのものです。

XmlDataProviderなどの Source プロパティをバインドしようとすると、

<XmlDataProvider Source="{Binding Path=XmlFilePath}"/>

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

バインディングを手続き的にまとめること以外に、宣言的にバインディングする方法はありXmlDataProvider Sourceますか? データ プロバイダーを使用せずにツリーをプロパティに直接バインドしようとすると、XmlNodeXPath バインディングを Xml オブジェクトでのみ使用するというエラーが表示されます。これは私にはまったく意味がありませんが、何か重要なことを伝えようとしているに違いありません。

4

3 に答える 3

4

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

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

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

<TreeView ItemsSource="{Binding Path=ProjectDocument XPath=.}">

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

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

<TreeView ItemsSource="{Binding Path=ProjectDocument}">
于 2009-12-09T00:27:32.813 に答える
2

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

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

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

    <XmlDataProvider x:Key="dshPreview" 
                     Source="~tmpConstruct.xml" 
                     XmlNamespaceManager="{StaticResource argNms}"   
                     IsAsynchronous="true"/>

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

  <TreeView  x:Name="PreviewTree" 
             ItemsSource="{Binding Source={StaticResource dshPreview},
             XPath=/mns:engine/mns:ws}"
              />         

多分これは誰かを助けるでしょう

于 2013-03-26T02:31:06.870 に答える
1

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

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

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

于 2012-10-18T08:49:48.407 に答える