WPF ContextMenu绑定失效问题

之前在尝试做右键菜单时部分菜单需要在运行时进行禁用,于是就想到了使用ElementName 来绑定运行按钮,因为运行按钮在运行时是禁用的,但是无论如何也绑定不上,后来经过查询才知道:
绑定失败的原因,是 Grid.ContextMenu 属性中赋值的 ContextMenu 不在可视化树中,而 ContextMenu 又不是一个默认建立 ScopeName 的控件,此时既没有自己指定 NameScope,有没有通过可视化树寻找上层设置的 NameScope,所以在绑定上下文中是找不到 WalterlvWindow 的。如果调用去查找,得到的是 null。
类似的情况也发生在设置非可视化树或逻辑树的属性时,典型的比如在 Grid.Row 或 Grid.Column 属性上绑定时,ElementName 也是失效的。
此时最适合的情况是直接使用 x:Reference来解决

  <Window x:Class="Walterlv.Demo.BindingContext.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:local="clr-namespace:Walterlv.Demo.BindingContext"
          x:Name="WalterlvWindow" Title="Walterlv Binding Demo" Height="450" Width="800">
      <Window.Resources>
          <local:BindingProxy x:Key="WalterlvBindingProxy" Data="{x:Reference WalterlvWindow}" />
      </Window.Resources>
      <Grid Background="LightGray" Margin="1 1 1 0" MinHeight="40">
          <Grid.ContextMenu>
              <ContextMenu>
-                 <MenuItem Header="{Binding Source={x:Reference WalterlvWindow}, Path=DemoText, Mode=OneWay}" />
                  <MenuItem Header="{Binding Source={StaticResource WalterlvBindingProxy}, Path=Data.DemoText, Mode=OneWay}" />
              </ContextMenu>
          </Grid.ContextMenu>
          <TextBlock>
              <Run Text="{Binding Mode=OneWay}" FontSize="20" />
              <LineBreak />
              <Run Text="{Binding ElementName=WalterlvWindow, Path=DemoText, Mode=OneWay}" />
          </TextBlock>
      </Grid>
  </Window>

转载于:https://cloud.tencent.com/developer/article/1580498

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值