我有以下 Xaml:
<DataGrid
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
SelectionMode="Single">
<DataGrid.ContextMenu>
<ContextMenu MinWidth="200">
<MenuItem
cal:Message.Attach="[Click] = [Action OnGroupSelected($data)]"
Header="Move Item to Group"
ItemsSource="{Binding Groups}">
<MenuItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Header="Name" />
<DataGridTextColumn Binding="{Binding Description}" Header="Description" />
</DataGrid.Columns>
</DataGrid>
我希望在单击 DataGrid 项目时出现一个上下文菜单,它将显示我想要将项目移动到的可用组的列表。
我可以让 ContextMenu 显示所有组及其名称并调用 OnGroupSlected(Group SelectedGroup) 但 SelectedGroup 为空。如何正确地将Item传递给OnGroupSlected?我正在使用 Caliburn.Micro 来处理 MVVM。
我尝试了很多方法,但没有一个有效:
<MenuItem
Header="Move Item to Group"
ItemsSource="{Binding Groups}">
<MenuItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</MenuItem.ItemTemplate>
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="cal:Message.Attach" Value="[Click] = [Action OnGroupSelected($data)]" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
我尝试解决你的问题并最终得到了这个解决方案:
cal:Message.Attach="[Click] = [Action OnGroupSelected($eventArgs)]"
$data
,默认情况下不存在。在您的代码中,您可以像这样访问它:
public void OnGroupSelected(RoutedEventArgs args)
{
if (args.OriginalSource is FrameworkElement fe)
{
if (fe.DataContext is Group group)
{
MessageBox.Show(group.Name);
}
}
}
$data
,但在代码中您需要先指定(添加)它:
...MessageBinder.SpecialValues.Add("$data", value =>
{
if (value.EventArgs is not RoutedEventArgs args)
return null;
if (args.OriginalSource is not FrameworkElement fe)
return null;
return fe.DataContext;
});
在 XAML 中使用:
cal:Message.Attach="[Click] = [Action OnGroupSelected($data)]"
代码中:
public void OnGroupSelected(Group SelectedGroup)
{
MessageBox.Show(SelectedGroup.Name);
}
希望这对您有帮助。