2012-06-18 19 views
7

私は文字列値のリストを表示するListViewを持っています。選択した項目を削除するために、リスト内の各項目のコンテキストメニュー項目を追加したいとします。私のXAMLは次のようになります:リストビューの項目を削除するためのコンテキストメニュー

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
    <ListView.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="Remove" 
       Command="{Binding RemoveItem}" 
       CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}" /> 
    </ContextMenu> 
    </ListView.ContextMenu> 
</ListView> 

CommandParameterの値は常にnullです。選択した項目を削除して、自分のコマンドが機能しているかどうかを確認するボタンを追加しました。ボタンはボタン操作と全く同じバインディングとアイテムの削除を持っています。ボタンは次のようになります。

<Button Content="Remove selected item" 
     Command="{Binding RemoveItem}" 
     CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}"/> 

コマンドは次のようになります。

private ICommand _removeItem; 

public ICommand RemoveItem 
{ 
    get { return _removeItem ?? (_removeItem = new RelayCommand(p => RemoveItemCommand((string)p))); } 
} 

private void RemoveItemCommand(string item) 
{ 
    if(!string.IsNullOrEmpty(item)) 
    MyItems.Remove(item); 

} 

コンテキストメニューを開くときに選択した項目がnullである理由を任意のアイデア?たぶん、リストビューの焦点問題?

+0

は、私はあなたがバインディングエラーメッセージを見つけることができます賭け、あなたの出力ウィンドウで見てください。 ContextMenuは新しいウィンドウなので、itemsListViewにアクセスできるかどうかはわかりません。 –

+0

http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenuおよびhttp://stackoverflow.com/questions/2617122/wpf-menuitem-command-binding-toをご覧ください。 -elementname-results-to-system-windows-data-error –

答えて

26

H.B.は正しい。しかし、あなたはまた、RelativeSourceを使用することができ、私にとってこの作品

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Remove" 
      Command="{Binding RemoveItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" /> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
+0

RelativeSourceの作業 - ありがとうございました! –

3

ContextMenusが接続されていない場合は、ElementNameバインディングを使用できません。 1つの回避策は、Binding.Sourcex:Referenceを使用することです。リソースを使用する部分を抽出する必要があります(周期的な依存関係エラーのため)。そこにコンテキストメニュー全体を置くことができます。

例:

<ListBox Name="lb" Height="200"> 
    <ListBox.Resources> 
     <ContextMenu x:Key="cm"> 
      <MenuItem Header="{Binding ActualHeight, Source={x:Reference lb}}" /> 
     </ContextMenu> 
    </ListBox.Resources> 
    <ListBox.ContextMenu> 
     <StaticResource ResourceKey="cm" /> 
    </ListBox.ContextMenu> 
</ListBox> 
0

バインディングCommandParameter =「{バインディング}」

関連する問題