最終的な注意事項 別の投稿で見つかった最終的な解決策
提供された説明に感謝しますが、最終的な解決策は、実際には上記のリンクにある別の解決策によって提供されました。何を試しても、「要素名」コンポーネントを介したバインドは機能しませんでした。データグリッドの「相対」階層に基づいて移動する必要がありました...
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding}"
Height="16" Width="16" HorizontalAlignment="Center" >
<Image Source="MyButtonImage.png" IsHitTestVisible="True"/>
</Button>
WPF/MVVM環境でそれほど複雑ではないことを願っています。これがシナリオです。
ウィンドウ(.xaml)と対応するビューモデル(.cs)があります。フォームは正常に表示され、すべてのデータバインディングに問題はありません。(注:これは、商用の「フレームワーク」を介して行われるものではありません)
ビューウィンドウにあるコントロールの1つは、ビューが表示されたときに表示されるすべての事前定義された列、見出し、およびコンテンツを含むデータグリッドのカスタムユーザーコントロールです。コントロールがメインウィンドウの.xamlファイルで直接「定義」されていなくても、これはすべて問題なく機能しますが、ユーザーコントロール自体(独自の明らかな.csコードビハインドがあります)としてフォームにドロップされます。
メインウィンドウの「DataContext」がビューモデルを指し、データグリッドを持つユーザーコントロールを使用します
<DataGrid AutoGenerateColumns="False"
Name="dataMyStuff"
ItemsSource="{Binding Path=MyTablePropertyOnViewModel,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}" ... />
今、私が探しているもの。このデータグリッドには、最初の列に画像がある列があります。この画像をクリックすると、この行で表されるレコードに固有のレポートを印刷したいと思います(使用するPK値があります)。それでは、画像の「KeyUp」イベントに、データが存在するビューモデルイベントハンドラーに移動するように指示するにはどうすればよいですか。また、レポートの呼び出しを準備するために必要なその他のメソッドもあります。グリッドの表示部分は、ユーザーに表面的な表示を行うためのものであり、したがって、このコントロールに直接「機能」はありません。
-編集-回答からの進捗ごと
JoshとRachelからのコメントごとにデータグリッドを調整しましたが、まだ何かが正しくないようです...ボタンが「コマンド」インスタンスを使用しているのを見て、これをインスタンスにアタッチする必要があると解釈しました。ビューモデルの「ICommand」インターフェイスオブジェクト。そこで、インスタンスを作成しました。コマンドハンドラーは、追加、編集、保存、キャンセル、終了などの一般的な操作にも使用されるため、機能することはわかっています。したがって、この印刷用に新しいコマンドハンドラーを用意しました。簡単にするために、Always Executeとして作成したので、コントロールの「CanExecute」部分を処理するメソッドはありません。ボタンの「コマンド」を、まだ何も考えられないほとんどすべての反復に設定しましたが、これが私が見ているものの更新です。
<UserControl>
<Data grid columns / template, etc to the button>
<DataTemplate>
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand}" >
<Image Source="myPrintImage.png"/>
</Button>
</DataTemplate>
</Data grid columns, etc>
</UserControl>
私のViewModelクラス(myICommandButtonHandlerはICommandから継承します)
private myICommandButtonHandler myPrintCommand;
public myICommandButtonHandler MyPrintCommand
{
get { if (myPrintCommand == null)
myPrintCommand = new myICommandButtonHandler(myPrint);
return myPrintCommand;
}
}
private void myPrint()
{
MessageBox.Show( "Doing the print job..." );
}
今、私が見ているもの。すべてのコントロールなどの初期化のステップスルー中。メニュー項目をクリックして、ウィンドウを呼び出して表示します。まず、ViewModelコントローラーのインスタンスを作成します。次に、ウィンドウを呼び出し、View Modelコントローラーをパラメーターとして渡すため、ウィンドウレベルでウィンドウの「DataContext」としてすぐに設定されます。次に、メインウィンドウは「InitializeComponents」呼び出しに入り、問題のデータグリッドを含むこの個別のクラスを含む、埋め込まれた他のすべてのコントロールの構築を開始します。このユーザーコントロール(データグリッドを持っている)のコンストラクターでは、残りのコントロールがまだ初期化されていないため、「データコンテキスト」はまだ設定されていません。また、「バインディング」が明らかに「夢中になった」だから、データグリッドのコマンドボタンへのバインドを実行しようとして失敗しているようです。ただし、実行時に実際のデータがグリッドで更新されるため、多くのことが機能していることがわかります。
したがって、データグリッドの「ItemsSource」はビューモデルの「DataView」プロパティのプロパティに設定されていますが、「ボタン」のバインドでは、「MyPrintCommand」ハンドラーが表示されないようです。 hit ..そしてそのアクションはメッセージボックスを表示することです(今のところ)。