2009-09-03 15 views
1

を使用してデータグリッド内のソースをバインド:私はのDataContextのEditLabelCommandに取得しようとしているが、私はバインディングソースを見つけることができません以下のようにのContextMenuが、私はDataGrid列を持っているMVVM

<toolkit:DataGridTemplateColumn> 
         <toolkit:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Path=LabelName}" Background="{Binding Path=Color}"> 
            <TextBlock.ContextMenu> 
             <ContextMenu> 
              <MenuItem x:Name="Assign" Header="Assign" 
                 mvvm:CommandBehavior.Event="Click" 
                 mvvm:CommandBehavior.Command="{Binding Path=DataContext.EditLabelCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel='1'}}" 
                 mvvm:CommandBehavior.CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}"/> 
             </ContextMenu> 
            </TextBlock.ContextMenu> 
           </TextBlock> 
          </DataTemplate> 
         </toolkit:DataGridTemplateColumn.CellTemplate> 

。 DataContextのコマンドにアクセスするにはどうすればよいですか?

答えて

3

DataContextは、a)DataContextを何かにバインドするとき、またはb)項目コントロール(またはあなたの場合はグリッド)のようなものを使用して、項目ごとにデータテンプレートを1回繰り返すときに、コレクション内で各項目のデータコンテキストを設定します。

この例では、メニュー項目にはTextBlockと同じDataContextがあります。これは、データグリッドの各行にバインドされたオブジェクトになります。

あなたのコードに基づいて、あなたはUserControl全体のDataContextセットで1つのEditLabelCommandを利用できると思います。これはおそらく、グリッドにバインドしているコレクションの親です。 (。これらの仮定のいずれかが間違っている場合が私を修正してください)

このような場合は、あなたが行うことができますいくつかのものがあります。

  • あなたは相対を結合使用し続けることができます。これは複雑であり、エラー が発生しやすく、データ のテンプレートや他のXAMLの再利用には至りません。私はこのテクニックを避けることをお勧めします。

  • 、全体のDataContextにコマンドを維持するための簡単な方法は、使用 WPF Model-View-ViewModel ToolkitからCommandReferenceにあります。この を使用すると、コマンドをリソースとして参照し、 へのリソースバインディングを使用してアクセスできます。このように:

 
    <UserControl.Resources> 
     <mvvmToolkit:CommandReference x:Key="EditLabelCommandReference" Command="{Binding EditLabelCommand}" /> 
    </UserControl.Resources> 

    <!-- Your command binding then looks much simpler --> 
    mvvm:CommandBehavior.Command="{StaticResource EditLabelCommandReference}" 
  • 別の(おそらくより良い)技術は、各行ためMVVMパターンを使用するリファクタリングです。この方法で、グリッドの行ごとに単純なViewModelを使用します。これにより、各行が独自の状態を維持することができます。 Command実装をこのViewModelに移すことができるため、1行に1つのコマンドがあり、引数を渡す必要はありません。これにより、一度に複数の行のラベルを編集することができます。 (これが要件の場合)
関連する問題