3つのタブがあり、それぞれに異なる種類のファイルのリストボックスがあります。右クリックで3つのリストボックスにバインドされたWPF ContextMenu
リストボックス内の項目を右クリックすると、項目ヘッダーとして「新規作成、編集、削除」を含むContextMenuが必要になります。
私は、各リストボックスのためのContextMenuを持つことができると思いますし、各ヘッダーのための別々の方法を持っている、など:
<ListBox.ContextMenu>
<ContextMenu x:Name="NewEditDeleteAdvCalcFileContextMenu">
<MenuItem Name="NewAdv" Header="New" Click="NewAdv_Click" />
<MenuItem Name="EditAdv" Header="Edit" Click="EditAdv_Click"/>
<MenuItem Name="DeleteAdv" Header="Delete" Click="DeleteAdv_Click"/>
</ContextMenu>
</ListBox.ContextMenu>
しかし、実際に、私はより良い方法があると願っています。
は私が ContextMenu as Static Resourceを示し、この記事を見て、これは私がやりたい何かのようです。コマンドを使用することが提案されているのと同じスレッドで : ContextMenu with Commands
と私はそれを必要とするのでそれで、私は、私がクリックされたListBoxItemの種類を取得することができます願っています。新しいファイルタイプBは新しいファイルタイプCとは違って扱われなければなりませんが、私は巨大なcontextmenusとNew/Edit/Deleteメソッドを望んでいません。
だから、現在、私は私のXAMLファイルで、この高を持っている。そして、
<UserControl.Resources>
<ContextMenu x:Key="NewEditDeleteContextMenu">
<MenuItem Header="New"
Command="{Binding Path=NewFileCommand}"
CommandTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"/>
<MenuItem Header="Edit"
Command="{Binding Path=EditFileCommand}"
CommandTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"/>
<MenuItem Header="Delete"
Command="{Binding Path=DeleteFileCommand}"
CommandTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"/>
</ContextMenu>
</UserControl.Resources>
とのTabItemでのリストボックス:どうすればよい
<ListBox Name="CalcFilesListBox"
Margin="20" ItemsSource="{Binding CalcFilesList}"
PreviewMouseRightButtonUp="ListBox_PreviewMouseRightButtonUp"
ContextMenu="{StaticResource NewEditDeleteContextMenu}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<EventSetter Event="MouseDoubleClick" Handler="CalcFileListBox_MouseDoubleClick"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
質問#1
ListBoxItemの右クリックでコンテキストメニューが表示されますが、これは静的リソースですか? があるので、私のxaml.csに私はこれでした:
private void ListBox_PreviewMouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// SelectItemOnRightClick(e);
NewEditDeleteContextMenu.PlacementTarget = sender as UIElement;
NewEditDeleteContextMenu.IsOpen = true;
}
をしかし、今、私はエラーと言ってい:
名「NewEditDeleteContextMenu」は現在のコンテキストに存在しません。
もともと私のようなリストボックスの一部として、コンテキストメニューを持っていたので:
<ListBox.ContextMenu>
...
しかし、これまで私は、各リストボックスのために別々のContextMenuを意味するだろう見ることができたとして。
質問#2
はのは、ユーザーコントロールに示したContextMenuの新アイテムヘッダ(のためのNewFileCommandを言わせて、コマンドを使用する正しい方法です。次の操作を実行するコードのリソースブロック):私のViewModelで
:ViewModelにのコンストラクタで
public RelayCommand<string> NewFileCommand { get; private set; }
、その後:基本的に
public CalcViewModel()
{
NewFileCommand = new RelayCommand<object>(NewFile);
}
public void NewFile(object sender)
{
//Determine the type of file, based on the ListBoxItem's DataContext.
That is, supposing the ListBoxItem is the object being passed as the sender.
}
、私は1つのContextMenuが異なるListBoxコントロールにバインドしたいですこれは右クリックでポップアップするはずです。たとえば、ContextMenuでNew項目が選択された場合、ListBoxにバインドされているファイルの種類を判別したいと思います。 例:リストボックス1は、ファイルタイプBのコレクションにバインドされています。リストボックス2は、ファイルタイプCのコレクションにバインドされています。リストボックス2のアイテムを右クリックして新規を選択すると、 C.
質問#3
これは非常に複雑なビューではありません。私はMVVMフレームワークを使用していませんでした。なぜなら、これまで私がそれを学ぶには時間がかかるとは考えていませんでしたが、このシナリオを考えれば、ListBoxItemsをダブルクリックするより単純なケースですコードブロックの1つに表示される場合は、フレームワークの使用をお勧めしますか?
今週初めにありがとうございましたが、私はまだいくつかの変更とコードのリファクタリングを行っています。私はすべてをテストしたらこれを答えとしてマークします。私はまた、タブの1つにツリービューを持っていますが、おそらくリストボックスを最初に取得する方が簡単だと思いました。私はGalaSoftのMVVMフレームワークを使用しませんが、私はあなたの答えを自分のものにするよう努めています。だから、私はさらに明確化を求めるかもしれませんが、ありがとう、あなたは巨大な助けになっています! – Igavshne
さて、コンテキストメニューをツリービューで共有することは可能ですか?私は実際に2つのリストボックスとツリービューを持っています。私はリストコマンドを使用してファイルタイプを送信するNewコマンドの問題を予見しています。コマンドにリストボックスの代わりにオブジェクトを送信すると、Tagプロパティが失われます。それ以外の場合は、私が推測するツリービュー用の別のコンテキストメニューを追加することができます。 – Igavshne
できると思います。あなたはそれを試しましたか?ツリービューには1つのタイプの項目しか含まれていないと仮定すると、CanExecuteメソッドとExecuteメソッドでListBoxではなくスーパークラスのFrameworkElementを使用するだけで、Tagメソッドを使用できます。 – josh2112