据了解
ContextMenu
在WPF中实际是以类似于
WIndow
的呈现方式,所以
ContextMenu
在当前页面的
Visualtree
中是找不到的。
当在
Listbox
中需要传递当前选中项给
ContextMenu
时,需要以特殊手法传递。

前台XAML代码
 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition />
         <RowDefinition Height="auto" />
     </Grid.RowDefinitions>
     <Grid.ContextMenu>
         <ContextMenu>
             <MenuItem Command="{Binding Data.DeleteFileCommand, Source={StaticResource proxy}}" Header="Delete" />
             <MenuItem Command="{Binding RenameFileCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.PlacementTarget}" Header="Rename" />
             <!--  {Binding ElementName=listbox} cannot find  -->
             <MenuItem Command="{Binding OpenFilePathCommand}" Header="Open File Path" />
         </ContextMenu>
     </Grid.ContextMenu>
</Grid>

在这里通过指定
ElementName
的方式并不生效,因为这两个不在同一
Visualtree
下,虽然写的时候不报错,但是运行后就会报错。(在新版MAUI上写的时候就会报错)

RelativeSource
的用法如下:
RelativeSource

MenuItem
通过
RelativeSource
绑定到自身的父物体中的
PlacementTarget
属性(注意此时并没有代码提示可以自动完成),然后在后台就可以通过
Command
的参数接受前台父物体,此处演示为
Grid
对象;

后台C#代码

 [RelayCommand]
 private void RenameFile(object obj)
 {
     var parent = obj as Grid;
     var txb = parent.FindName("txb1") as TextBox;
     if (txb != null)
     {
         IsEditFileName = true;
         txb.LostFocus += Txb_LostFocus;
         var res = txb.Focus();
     }
 }

完整示例可参考
https://github.com/KleinPan/One

标签: none

添加新评论