私は現在ロードし、最終的にはオフディスク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
を設定 デイブ
'MenuItem'にはそれがあると思う' DataContext'がありますか? 'Command =" {Binding ClickCommand、PresentationTraceSources.TraceLevel = High} "を試し、VS出力ペインでトレース情報を確認してください。それが最初に試すものです。 –
DataContextは、MenuItemではなくウィンドウ上にあります。これは動的に読み込まれたXAMLなので、何が入っているのかわからない。しかし、ここでのポイントは、特定のプロパティ(私が働いているもの)と特定のアクション(私が働いていないもの)にバインディングを通してアクセスできるようにすることです。私はPresentationTraceSources.TraceLevel = Highを試してみて、それが何を見るかを見てください – DAufderh
"アクション"はどういう意味ですか? ClickCommandはどのように定義されていますか?とにかく、ウィンドウのDataContextを継承しないように、MenuItemはビジュアルツリーにはありません。これは、そのバインディングの問題になりそうです。 –