带有 Caliburn.Micro 的 MenuItem 无法将 Item 传递给方法

问题描述 投票:0回答:1

我有以下 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>
c# wpf contextmenu menuitem caliburn.micro
1个回答
0
投票

我尝试解决你的问题并最终得到了这个解决方案:

  1. 在 XAML 中使用:
    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);
        }
    }
}
  1. 或者您可以在 XAML 中使用
    $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);
}

希望这对您有帮助。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.