Caliburn框架中二级Menu无法调用ViewModel方法
2014-08-16 20:39
260 查看
公司WPF程序开发中应用了Caliburn框架,最近在做一个DataGrid上二级MenuItem时,发现Click方法无法调用ViewModel中的方法,但是回来后,在自己的机器上写了一个类似的测试程序时,却能够调用ViewModel中的方法
测试程序DataGrid
ViewModel中对应的方法
在公司时,一级MenuItem中也无法调用ViewModel中的方法,原因应该是MenuItem与DataGrid不在一个视觉树中。由于无法复现问题,只能修改测试程序将我找到的解决方法贴出来。
参考自:http://stackoverflow.com/questions/13587368/no-target-found-for-method-thrown-by-caliburn-message-attach
测试程序DataGrid
<DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collection, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" > <DataGrid.ContextMenu> <ContextMenu Name="menuList" > <MenuItem Header="查看" cal:Message.Attach="[Event Click]=[Action Show()];"> </MenuItem> <MenuItem Header="修改一下"> <MenuItem Header="修改" cal:Message.Attach="[Event Click]=[Action Modify()];"></MenuItem> <MenuItem Header="删除" cal:Message.Attach="[Event Click]=[Action Delete()]"></MenuItem> </MenuItem> </ContextMenu> </DataGrid.ContextMenu> <DataGrid.Columns> <DataGridTemplateColumn Header="姓名" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Name, Mode=TwoWay}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="性别" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Sex, Mode=TwoWay}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="年龄" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Age, Mode=TwoWay}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
ViewModel中对应的方法
public void Show() { MessageBox.Show("查看成功"); } public void Modify() { MessageBox.Show("修改成功"); } public void Delete() { MessageBox.Show("删除成功"); }
在公司时,一级MenuItem中也无法调用ViewModel中的方法,原因应该是MenuItem与DataGrid不在一个视觉树中。由于无法复现问题,只能修改测试程序将我找到的解决方法贴出来。
<DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collection, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" > <DataGrid.ContextMenu> <ContextMenu Name="menuList" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> <MenuItem Header="查看" cal:Message.Attach="[Event Click]=[Action Show()];"> </MenuItem> <MenuItem Header="修改一下"> <MenuItem Header="修改" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" cal:Message.Attach="[Event Click]=[Action Modify()];"> </MenuItem> <MenuItem Header="删除" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" cal:Message.Attach="[Event Click]=[Action Delete()]"> </MenuItem> </MenuItem> </ContextMenu> </DataGrid.ContextMenu> <DataGrid.Columns> <DataGridTemplateColumn Header="姓名" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Name, Mode=TwoWay}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="性别" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Sex, Mode=TwoWay}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="年龄" Width="100"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Age, Mode=TwoWay}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
参考自:http://stackoverflow.com/questions/13587368/no-target-found-for-method-thrown-by-caliburn-message-attach
相关文章推荐
- 下载文件时报错 "由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值" 解决方法
- 调用、函数-UITableView内容无法刷新的解决方法-by小雨
- 继承 SurfaceView 无法调用到onDraw()的解决方法
- CI框架的全局函数、类库中调用model层的方法
- “由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- [Bug]由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法(转)
- ThinkPHP框架----控制器调用模型里的方法,一直报错——Think\Model:..方法不存在!
- 【.Net码农】Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- MVVM 后台代码调用viewModel方法
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- WebView中调用assets下的js脚本无法正常执行的解决方法
- 转:“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- 【Django】框架ajax无法调用后台方法问题
- WKWebView无法接受到JS调用原生方法的回调.
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- asp.net出现的异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值" 的解决方法