2011-06-11 25 views
2

私はWPFアプリケーションを作成し、MVVMパターンに従っています。 xamlにコンテキストメニューがあり、コマンドとヘッダテキストをバインドする必要があります。次のコードを使用して、コンテキストメニューのヘッダーを、観察可能なコレクションであるBOListのプロパティである「MenuItemName」にバインドできます。私の問題は、コマンドは解雇されていないということですか?コンテキストメニューのアイテムソースをdatacontextに変更します。MVVMを使用したコンテキストメニュー項目のWPF +バインディングコマンドと項目

(DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}") 

コマンドは正常ですが、私のヘッダーは空白になります。私のヘッダーとメニュー項目のコマンドをバインドする方法はありますか?ここでコマンドMenuClickはVMのIcommandプロパティであり、MenuItemNameはリストボックスにバインドされた観測可能なコレクションであるBOList内のプロパティです。コンテキストメニューで

<Grid> 
<StackPanel Orientation="Vertical"> 
    <Button x:Name="btnClickMe" Command="{Binding ButtonCommand}" Content="Click Me" /> 
    <ListBox ItemsSource="{Binding BOList}" x:Name="lstDemo" SelectedItem="{Binding BussinessObj,Mode=OneWayToSource}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel x:Name="stkStyleRender" Orientation="Horizontal" Background="Cyan" Width="525" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" > 
      <TextBlock x:Name="txtId" Text="{Binding FirstName}"></TextBlock> 
      <TextBlock x:Name="txtName" Text="{Binding LastName}"></TextBlock> 
      <StackPanel.ContextMenu> 
      <ContextMenu x:Name="cntMnuTest" ItemsSource ="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" > 
       <MenuItem Header="{Binding MenuItemName}" Command="{Binding MenuClick}" CommandParameter="Icon"></MenuItem> 
      </ContextMenu> 
      </StackPanel.ContextMenu> 

     </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
</StackPanel> 

+0

を助けたMenuItemNameはViewModelにのように何を見ていますか? Beinding Expressionエラーもコンソール出力で調べ、表示されていればそれを投稿してください。 – Berryl

答えて

0

、あなたのメニュー項目が

+0

datacontextが設定されているとしようとしましたがコマンドが動作しますが、ヘッダープロパティのバインドに失敗しました。もしアイテムのソースが設定されていればヘッダーバインディングは動作しますが、コマンドバインディングは失敗します,,, – user793886

+1

こんにちは。コンテキストメニューのItem SourceをBOList(observable collection)コマンドに設定すると、icommandの定義がWindow data ciontext(vm)にあるため、コマンドが起動しません。私たちは賢明なコードを扱う必要があります。デバッグはバインディングでは不可能なので、私はブッシュの周りで殴っていました:-) ..このリンクは私に多くの助けをしましたhttp://www.wpftutorial.net/DebugDataBinding.html – user793886

0

をバインドする代わりにアイテムのソース
を使用してのDataContextのを使用し、これを試してみてください。

<MenuItem Header="{Binding Path=PlacementTarget.MenuItemName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" Command="{Binding Path=PlacementTarget.MenuClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" /> 
+0

私のために働いていません... – user793886

+0

もしあなたはDataContextを設定してからbindinngコマンドを実行し、アイテムソースヘッダバインディングが発生すると.. ??? <バインドMenuItemName> "Command =" {バインディングMenuClick} "CommandParameter =" cntMnuTest "ItemsSource =" {バインディングパス= PlacementTarget.Tag、RelativeSource = {RelativeSource Self}} "> user793886

+0

あなたはもっと説明できますか? –

1

こんにちは、問題が特定されます。

ICommandの定義がウィンドウデータコンテキスト(vm)にあるため、コンテキストメニューのアイテムソースをBOList(observable collection)コマンドに設定しないとコマンドが起動しません。

わかりやすいコードを処理する必要があります。デバッグ以来

私は

このリンク:-)遠回しに言うた、結合のために可能ではないが、私をたくさんWPF Tutorial - Debug Databinding Issues in WPF

関連する問題