您的位置:首页 > 其它

Caliburn框架中二级Menu无法调用ViewModel方法

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

测试程序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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐