특정 시나리오에 따라 사용할 미리 정의 된 컨텍스트 메뉴가있는 경우 항상 컨텍스트 메뉴를 리소스로 만들 수 있습니다.
<Window.Resources>
<ContextMenu x:Key="Menu1">
<MenuItem>Item1</MenuItem>
</ContextMenu>
<ContextMenu x:Key="Menu2">
<MenuItem>Item1</MenuItem>
<MenuItem>Item2</MenuItem>
</ContextMenu>
</Window.Resources>
그리고 생성 된 데이터는 ContextMenu
오히려 매우 지저분한 얻을 수 있습니다 나는이에 대한보기 모델이나 뒤에 코드의 속성에 바인딩 제안 아래에 내가 한 일보다, 사용하도록 설정하기 위해 ListBox
트리거 xaml에서. 구현은 여기에서 하나의 항목이 선택되어 있는지 확인하고, 그 경우에 표시되는 컨텍스트 메뉴의 선택은 단지 I 코드에 처리 제안 뷰에 관심있는 경우
<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>
을 메뉴 1로 전환 뒤에. 뷰 모델이 메뉴를 표시 할 몇 가지 관심을 가지고있는 경우
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;
}
}
(그것을 같은 소리하지만 전체 상황을 모르고 얘기하기 어렵다되지 않습니다) 당신이 뷰 모델에서 결정하게 몇 가지 속성을 노출 할 수 있지만 어떤 ContextMenu
표시합니다. 개별 부울 속성보다는 오히려 특정 시점에 부울 중 하나만 true가되는 클래스를 만들려고 할 가능성이 큽니다.
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
}
링크가 유효하지 않습니다. – aaron
업데이트 된 문서 : https://msdn.microsoft.com/en-us/library/bb613568.aspx –
문서가 어떤 식 으로든 다시 제거되는 경우 제목은 '처리 방법 : 핸들 ContextMenuOpening Event '를 검색 할 수 있습니다. – Rolfi