WPF中 ContextMenu 寻找父物体的一种方案
生活随笔
收集整理的這篇文章主要介紹了
WPF中 ContextMenu 寻找父物体的一种方案
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
據(jù)了解 ContextMenu 在WPF中實際是以類似于WIndow的呈現(xiàn)方式,所以 ContextMenu 在當(dāng)前頁面的 Visualtree 中是找不到的。
當(dāng)在Listbox中需要傳遞當(dāng)前選中項給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的參數(shù)接受前臺父物體,此處演示為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
總結(jié)
以上是生活随笔為你收集整理的WPF中 ContextMenu 寻找父物体的一种方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《保卫萝卜4》周赛2023年12月25日
- 下一篇: 上海西郊动物园(上海动物园真的好玩吗?)