zoukankan      html  css  js  c++  java
  • Caliburn框架中二级Menu无法调用ViewModel方法

    公司WPF程序开发中应用了Caliburn框架,最近在做一个DataGrid上二级MenuItem时,发现Click方法无法调用ViewModel中的方法,但是回来后,在自己的机器上写了一个类似的测试程序时,却能够调用ViewModel中的方法

    测试程序DataGrid

     1 <DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collection, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
     2                 >
     3                 <DataGrid.ContextMenu>
     4                     <ContextMenu Name="menuList" >                        
     5                         <MenuItem Header="查看" cal:Message.Attach="[Event Click]=[Action Show()];">
     6                         </MenuItem>
     7                         <MenuItem Header="修改一下">
     8                             <MenuItem Header="修改" cal:Message.Attach="[Event Click]=[Action Modify()];"></MenuItem>
     9                             <MenuItem Header="删除" cal:Message.Attach="[Event Click]=[Action Delete()]"></MenuItem>
    10                         </MenuItem>
    11                     </ContextMenu>
    12                 </DataGrid.ContextMenu>
    13 
    14                 <DataGrid.Columns>
    15                     <DataGridTemplateColumn Header="姓名" Width="100">
    16                         <DataGridTemplateColumn.CellTemplate>
    17                             <DataTemplate>
    18 
    19                                 <TextBlock Text="{Binding Path=Name, Mode=TwoWay}"/>
    20                             </DataTemplate>
    21                         </DataGridTemplateColumn.CellTemplate>
    22                     </DataGridTemplateColumn>
    23 
    24                     <DataGridTemplateColumn Header="性别" Width="100">
    25                         <DataGridTemplateColumn.CellTemplate>
    26                             <DataTemplate>
    27 
    28                                 <TextBlock Text="{Binding Path=Sex, Mode=TwoWay}" />
    29                             </DataTemplate>
    30                         </DataGridTemplateColumn.CellTemplate>
    31                     </DataGridTemplateColumn>
    32                     <DataGridTemplateColumn Header="年龄" Width="100">
    33                         <DataGridTemplateColumn.CellTemplate>
    34                             <DataTemplate>
    35 
    36                                 <TextBlock Text="{Binding Path=Age, Mode=TwoWay}"/>
    37                             </DataTemplate>
    38                         </DataGridTemplateColumn.CellTemplate>
    39                     </DataGridTemplateColumn>
    40                 </DataGrid.Columns>
    41             </DataGrid>

    ViewModel中对应的方法

     1 public void Show()
     2         {
     3             MessageBox.Show("查看成功");
     4         }
     5 
     6         public void Modify()
     7         {
     8             MessageBox.Show("修改成功");
     9         }
    10 
    11         public  void Delete()
    12         {
    13             MessageBox.Show("删除成功");
    14         }

    在公司时,一级MenuItem中也无法调用ViewModel中的方法,原因应该是MenuItem与DataGrid不在一个视觉树中。由于无法复现问题,只能修改测试程序将我找到的解决方法贴出来。

     1 <DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collection, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
     2                 >
     3                 <DataGrid.ContextMenu>
     4                     <ContextMenu Name="menuList" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">                        
     5                         <MenuItem Header="查看" cal:Message.Attach="[Event Click]=[Action Show()];">
     6                         </MenuItem>
     7                         <MenuItem Header="修改一下">
     8                             <MenuItem Header="修改" 
     9 cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
    10 cal:Message.Attach="[Event Click]=[Action Modify()];">
    11 </MenuItem>
    12                             <MenuItem Header="删除" 
    13 cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
    14 cal:Message.Attach="[Event Click]=[Action Delete()]">
    15 </MenuItem>
    16                         </MenuItem>
    17                     </ContextMenu>
    18                 </DataGrid.ContextMenu>
    19 
    20                 <DataGrid.Columns>
    21                     <DataGridTemplateColumn Header="姓名" Width="100">
    22                         <DataGridTemplateColumn.CellTemplate>
    23                             <DataTemplate>
    24 
    25                                 <TextBlock Text="{Binding Path=Name, Mode=TwoWay}"/>
    26                             </DataTemplate>
    27                         </DataGridTemplateColumn.CellTemplate>
    28                     </DataGridTemplateColumn>
    29 
    30                     <DataGridTemplateColumn Header="性别" Width="100">
    31                         <DataGridTemplateColumn.CellTemplate>
    32                             <DataTemplate>
    33 
    34                                 <TextBlock Text="{Binding Path=Sex, Mode=TwoWay}" />
    35                             </DataTemplate>
    36                         </DataGridTemplateColumn.CellTemplate>
    37                     </DataGridTemplateColumn>
    38                     <DataGridTemplateColumn Header="年龄" Width="100">
    39                         <DataGridTemplateColumn.CellTemplate>
    40                             <DataTemplate>
    41 
    42                                 <TextBlock Text="{Binding Path=Age, Mode=TwoWay}"/>
    43                             </DataTemplate>
    44                         </DataGridTemplateColumn.CellTemplate>
    45                     </DataGridTemplateColumn>
    46                 </DataGrid.Columns>
    47             </DataGrid>

    参考自:http://stackoverflow.com/questions/13587368/no-target-found-for-method-thrown-by-caliburn-message-attach

  • 相关阅读:
    JavaScript 利用 filter+正则表达式对 list进行过滤包括模糊匹配
    odoo恢复数据库后,登录之后,显示空白页的问题
    Vue修改对象的属性值后页面不重新渲染问题
    智慧树(知到)刷课软件更新详情
    【C#】对两张图片进行矩阵运算会怎么样?
    DICOM协议中的UID详解
    DICOM医学文件的解析
    robots.txt协议——网络爬虫的“盗亦有道”
    机器学习算法之Kmeans算法(K均值算法)
    OPENGL shader 知识点
  • 原文地址:https://www.cnblogs.com/shuqiangji/p/3916880.html
Copyright © 2011-2022 走看看