在WPF中,使用MVVM light,有一個Class
(它由一些學生組成),並且Class
包含一些Student
s。命令綁定到ContextMenu(它在ListBox中的ListBoxItem上)不起作用
右鍵點擊一個學生的名字,然後會顯示一個MessageBox
,正是在這樣確定:
ClassDetailView.xaml
<UserControl DataContext="{Binding ClassDetail, Source={StaticResource Locator}}">
<DockPanel>
<ListBox
ItemsSource="{Binding Students}"
DisplayMemberPath="Name">
<ListBox.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem
Header="Show Selected"
Command="{Binding Path=DataContext.RemoveStudentCommand}"
CommandParameter="{Binding Path=SelectedItem}"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
</DockPanel>
</UserControl>
但是,它不工作這樣(使用ListBox.ItemContainerStyle):
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Show Selected"
Command="{Binding Path=DataContext.RemoveStudentCommand}"
CommandParameter="{Binding Path=SelectedItem}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
,而不是
<ListBox.ContextMenu>
<ContextMenu ...>
...
<ContextMenu />
</ListBox.ContextMenu>
ClassDetailViewModel.cs
namespace ContextMenu.ViewModel
{
public class ClassDetailViewModel : ViewModelBase
{
public ClassDetailViewModel()
{
CreateData();
}
public void CreateData()
{
students.Add(new StudentViewModel() { Name = "QQ" });
students.Add(new StudentViewModel() { Name = "WW" });
students.Add(new StudentViewModel() { Name = "EE" });
students.Add(new StudentViewModel() { Name = "RR" });
students.Add(new StudentViewModel() { Name = "AA" });
students.Add(new StudentViewModel() { Name = "SS" });
students.Add(new StudentViewModel() { Name = "DD" });
students.Add(new StudentViewModel() { Name = "FF" });
students.Add(new StudentViewModel() { Name = "ZZ" });
students.Add(new StudentViewModel() { Name = "XX" });
}
public const string StudentsPropertyName = "Students";
private ObservableCollection<StudentViewModel> students =
new ObservableCollection<StudentViewModel>();
public ObservableCollection<StudentViewModel> Students
{
get { return students; }
set
{
if (students == value) { return; }
students = value;
RaisePropertyChanged(StudentsPropertyName);
}
}
private RelayCommand<StudentViewModel> removeStudentCommand;
public RelayCommand<StudentViewModel> RemoveStudentCommand
{
get
{
return removeStudentCommand
?? (removeStudentCommand =
new RelayCommand<StudentViewModel>(ExecuteRemoveStudentCommand));
}
}
private void ExecuteRemoveStudentCommand(StudentViewModel student)
{
if (null == student) { return; }
MessageBox.Show(string.Format("RemoveStudent:{0}", student.Name));
}
}
}
StudentViewModel.cs
namespace ContextMenu.ViewModel
{
public class StudentViewModel : ViewModelBase
{
public const string NamePropertyName = "Name";
private string name = "";
public string Name
{
get { return name; }
set
{
if (name == value) { return; }
name = value;
RaisePropertyChanged(NamePropertyName);
}
}
}
}
我只是想,只顯示文本菜單時,右鍵單擊一個ListBoxItem,而不是完整的ListBox。 – SubmarineX
看看:http://stackoverflow.com/questions/9549231/how-to-right-click-on-item-from-listbox-and-open-menu-on-wpf – sexta13
我不認爲他們如果使用ListBox.Resources是不同的。在我的應用程序中使用MVVM,所以它會更復雜。 – SubmarineX