特定のシナリオに基づいて使用する事前定義されたコンテキストメニューのセットがある場合は、いつでもコンテキストメニューをリソースとして作成できます。
<Window.Resources>
<ContextMenu x:Key="Menu1">
<MenuItem>Item1</MenuItem>
</ContextMenu>
<ContextMenu x:Key="Menu2">
<MenuItem>Item1</MenuItem>
<MenuItem>Item2</MenuItem>
</ContextMenu>
</Window.Resources>
次に、データトリガーを作成して、を使用するListBox
ように設定します。ContextMenu
以下で行ったことではなく、xamlで非常に乱雑になる可能性があるため、ビューモデルまたはコードビハインドのプロパティにバインドすることをお勧めします。ここでの実装は、1つの項目のみが選択されているかどうかを確認し、その場合はMenu1に切り替わります。
<ListBox x:Name="mylist" SelectionMode="Multiple" ContextMenu="{StaticResource Menu2}" >
<ListBox.Style>
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SelectedItems.Count, RelativeSource={RelativeSource Self}}" Value="1" >
<Setter Property="ContextMenu" Value="{StaticResource ResourceKey=Menu1}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DisplayName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
表示するコンテキストメニューの選択がビューのみに関係する場合は、コードビハインドで処理することをお勧めします。
public partial class MainWindow : Window
{
public MainWindow()
{
// Hook up any events that might influence which menu to show
mylist.SelectionChanged += listSelectionChanged;
InitializeComponent();
}
private void listSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = sender as ListBox;
if (listBox == null)
return; // Or throw something, hard
ContextMenu menuToUse;
// Logic for selecting which menu to use goes here
listBox.ContextMenu = menuToUse;
}
}
ViewModelがどのメニューを表示するかに関心がある場合(そのようには聞こえませんが、完全なコンテキストを知らなければ見分けるのは難しいです)、ViewModelで表示するメニューを決定できるいくつかのプロパティを公開できますContextMenu
。個々のブール値プロパティではなく、常に1つのブール値のみが真であることを確認するクラスを作成することをお勧めします。
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
SelectedItems = new ObservableCollection<string>();
SelectedItems.CollectionChanged += SelectedItemsChanged;
}
private void SelectedItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Logic to see which ShowMenuX property to set to true goes here
}
public ObservableCollection<string> SelectedItems { get; set; }
private bool _showMenu1 = false;
public bool ShowMenu1
{
get { return _showMenu1; }
set
{
_showMenu1 = value;
RaisePropertyChanged("ShowMenu1");
}
}
// INotifyPropertyChanged implementation goes here
}