2016-11-30 18 views
0

私は現在ロードし、最終的にはオフディスクXAMLファイルを表示するには、次のコードを使用しています:C#の動的にロードされたXAMLファイルおよびコマンドバインディング

StreamReader mysr = new StreamReader(absFile); 
Window window = XamlReader.Load(mysr.BaseStream) as Window; 
window.DataContext = SomeViewModel; 

私は、テキストやその他の要素によってのためにバインディングを行うことができますよこのようなビューモデルのプロパティにアクセス:

<Label Content="{Binding Path=SomeStringProperty}" ... /> 

私がすることができ、画像をロードするか、視界値にブール値を変更するようなもののためにも、セットアップコンバータは。私が働くことができないのは、ボタンのクリックやメニュー項目の選択がビューモデル(または、私のアプリケーションの他のどのクラスでも問題ありません)内でコードを呼び出すようにするバインディングです。選択されたときに、このmenuItemには、私のコードで「ClickCommand」と呼ぶだろう

<MenuItem Command="{Binding Path=ClickCommand}" CommandParameter="Some Parameter" Header="Some Menu Item" /> 

:私はこのような何かを見てのMenuItemをしたいと思います。これがいくつかのICommandの実装を通して行われているとすれば、 "CanExecute"関数も実装することができますが、必要があればそれを使わずに済むでしょう。

私は何時間も検索しましたが、想像できるものを試しましたが、何もできません。私は信じられないほどあいまいな例外や完全に無言の失敗(メニュー項目をクリックすると何も起こらないという意味)を得ます。誰かがこれを行うことができるxamlコードとバッキングC#クラスの両方の例を提供できますか?

今私が考えることができるのは、VisualTreeHelperなどを使用してウィンドウ要素を歩いて、名前プロパティの規則に基づいてコマンドバインディングを手動で追加することだけです。私はこれを素早く試作したように、これを働かせることができますが、よりよい方法が必要です。 PresentationTraceSources.TraceLevel=Highを設定 デイブ

+0

'MenuItem'にはそれがあると思う' DataContext'がありますか? 'Command =" {Binding ClickCommand、PresentationTraceSources.TraceLevel = High} "を試し、VS出力ペインでトレース情報を確認してください。それが最初に試すものです。 –

+0

DataContextは、MenuItemではなくウィンドウ上にあります。これは動的に読み込まれたXAMLなので、何が入っているのかわからない。しかし、ここでのポイントは、特定のプロパティ(私が働いているもの)と特定のアクション(私が働いていないもの)にバインディングを通してアクセスできるようにすることです。私はPresentationTraceSources.TraceLevel = Highを試してみて、それが何を見るかを見てください – DAufderh

+0

"アクション"はどういう意味ですか? ClickCommandはどのように定義されていますか?とにかく、ウィンドウのDataContextを継承しないように、MenuItemはビジュアルツリーにはありません。これは、そのバインディングの問題になりそうです。 –

答えて

1

が鍵となった

おかげで...私は以前、約100のものを試してみましたが、どこにも持っていませんでした。しかしTraceLevelのセットで、私は戻って、このポストの提案を行ってきました:

How to bind WPF button to a command in ViewModelBase?

をTraceLevelのセットで、私ははっきりと物事が私はテストとして、ディスク上の古いXAMLファイルを使用していたことを除いて取り組んで見ることができました。 MenuItemのDataContextを手動で設定していたため、呼び出すコマンドを含むものが上書きされていました。

関連する問題