2016-05-03 8 views
0

WPF用のデザイナーアプリケーションを作成しています。このアプリケーションでは、ユーザーがWPFウィンドウでコントロールをドロップし、 SourceおよびPathプロパティです。 ユーザーは新しいWPFウィンドウを終了した後、バインディング(XamlWriter-and-Bindings-Serialization)を含むXMLファイルにシリアル化できます。WPFのXML定義ファイルのロード後にバインディングがリフレッシュされない

ユーザーが新しいウィンドウを使用する場合、XMLファイルは新しいWPFウィンドウに読み込まれ、保存された定義によってコントロールとそのバインディングが復元されます。これをテストする

、我々はそのDataSourceにバインドされている、我々は(コードビハインドで)WPFウィンドウで作成したテストプロジェクトとDataSourceやコントロールなどDataTableを行いました。 ViewModelDataSetというタイプのプロパティは、DataTableを含んでいます。我々はXMLとしてWPFウィンドウを保存すると 、コントロールとバインディングはそのようなXMLファイルに書き込まれます。別の「testwindow」が

<TextBox Text="{Binding Path=[0][Name], UpdateSourceTrigger=PropertyChanged}" Width="120" Canvas.Left="20" Canvas.Top="10" /> 

我々はDataSourceを作成し、XMLファイルをロードするように制御し、バインディングは再作成されますが、バインディングがリフレッシュされていないようです。 上記TextBoxは空です。

XmlDataProviderでリフレッシュしようとしましたが、動作しません。

XmlDataProvider provider = new XmlDataProvider(); 
provider = (XmlDataProvider)this.DataContext; 
provider.Refresh(); 

バインディングを更新するにはどうすればよいですか?

ありがとうございます!

+2

"WPF用XML定義ファイル"とは、おそらくXAMLを意味します。次に、XamlReaderを使用して、 'XmlDataProvider'。[' XamlReader.Load'](https://msdn.microsoft.com/en-us/library/system.windows.markup(v = vs.110).aspx)はXAMLを解析し、そのXAMLのルートオブジェクトを返す – Clemens

+0

Clemensありがとうございました!その間、私たちは、TestWindowで、DataContextがViewModelではなくDataTableを取得するときに正常に動作することを発見しました。 wModel DataTableが存在するDataSetプロパティ。 BindingがViewModelのDataSetからDataTableを取得できるように、Bindingを調整することはできますか? –

答えて

0

この問題を解決する方法は2つあります。

  1. WPFウィンドウのDataContextプロパティは、DataTableまたはそのDataViewバージョン( - > datatable.DefaultView)を取得します。しかし、これは、WPFウィンドウに1つのデータテーブルしか持たないことを意味します。
  2. 追加のDependencyPropertyを持つCustomControlを作成して、コントロールがバインドされているDataTableの名前を格納します。シリアル化からのXMLファイルをリロードした後、すべてのコントロールを調べ、プロパティ(if(frameworkelement.GetType()、GetProperty(propertyname)!= null)を持っているかどうかを確認し、コントロールのDataContextプロパティを設定しますそのような場合は、多くのデータテーブルで可能です。
関連する問題