Wenn Sie über eine Reihe von vordefinierten Kontextmenüs verfügen, die Sie basierend auf bestimmten Szenarien verwenden möchten, können Sie Ihre Kontextmenüs immer als Ressourcen erstellen.
<Window.Resources>
<ContextMenu x:Key="Menu1">
<MenuItem>Item1</MenuItem>
</ContextMenu>
<ContextMenu x:Key="Menu2">
<MenuItem>Item1</MenuItem>
<MenuItem>Item2</MenuItem>
</ContextMenu>
</Window.Resources>
Und dann schaffen Daten lösen auf Ihrem ListBox
die ContextMenu
einstellen zu verwenden, und nicht als das, was ich getan habe unter ich dafür zu Eigenschaften auf Ihrer Ansicht nach Modell oder Code hinter Bindung würde vorschlagen, da es sehr chaotisch könnte in Xaml. Die Implementierung überprüft hier, um zu sehen, wenn nur ein Element ausgewählt ist und in diesem Fall schaltet
<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>
menu1 Wenn die Auswahl für das Menü welchem Kontext zeigen nur ein Anliegen der Ansicht ist, würde ich es im Code vorschlagen Handhabung hinter.
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;
}
}
Während, wenn das Ansichtsmodell eines gewisses Interesse hat, in dem Menü zu zeigen (klingt nicht wie es, aber es ist schwer, ohne zu sagen, den vollen Kontext zu wissen) Sie einige Eigenschaften aussetzen könnten, die Sie im Ansichtsmodell entscheiden lassen welche ContextMenu
zu zeigen. Obwohl Sie eher als einzelne boolesche Eigenschaften eine Klasse erstellen möchten, die sicherstellt, dass immer nur einer der Booleschen Werte wahr ist.
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
}
der Link ist jetzt ungültig – aaron
Aktualisierte Dokumentation: https://msdn.microsoft.com/en-us/library/bb613568.aspx –
Nur für den Fall, dass das Dokument in irgendeiner Weise wieder entfernt wird, lautet der Titel "How to: Handle das ContextMenuOpening-Ereignis ", so dass Sie danach suchen können. – Rolfi