0

最終的な注意事項 別の投稿で見つかった最終的な解決策

提供された説明に感謝しますが、最終的な解決策は、実際には上記のリンクにある別の解決策によって提供されました。何を試しても、「要素名」コンポーネントを介したバインドは機能しませんでした。データグリッドの「相対」階層に基づいて移動する必要がありました...

<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 ..そしてそのアクションはメッセージボックスを表示することです(今のところ)。

4

2 に答える 2

2

通常、私はAttachedCommandビヘイビアーを使用して、イベントをViewModelコマンドにバインドできるようにします。たとえば、

<Image ...
       local:CommandBehavior.Event="KeyUp"  
       local:CommandBehavior.Command="{Binding DataContext.PrintCommand, ElementName=dataMyStuff}"
       local:CommandBehavior.CommandParameter="{Binding }"/>

KeyUpとは別のイベントを使用することをお勧めします。これは、Imagesがキーボードフォーカスを持つことができないため、KeyUpイベントが発生しないためです。

より良い代替手段は、ボタンを使用し、そのテンプレートを上書きして画像にすることです。これにより、機能が維持され、プロパティへのClickアクセスCommandCommandParameterプロパティが提供されます

<Button Command="{Binding DataContext.PrintCommand, ElementName=dataMyStuff}"
        CommandParameter="{Binding }">
    <Button.Template>
        <Image ... />
    </Button.Template>
</Button>

また、CommandParameter="{Binding }"は現在のDataRowのDataContext(データオブジェクト)をコマンドに渡すだけです。

于 2012-01-04T19:33:25.313 に答える
1

データテンプレートを、コンテンツとして画像を含むボタンに変更します。ボタンのcommandおよびcommandparameterプロパティを使用して、印刷メソッドを呼び出します。ビューモデルで印刷コマンドを宣言し、それにバインドすることができます。パラメータは、データグリッドで選択された行である可能性があります。

于 2012-01-04T19:26:46.597 に答える