为了账号安全,请及时绑定邮箱和手机立即绑定

来自ToolTip或ContextMenu的RelativeSource绑定

来自ToolTip或ContextMenu的RelativeSource绑定

慕标5832272 2019-10-21 09:46:39
我在这里做错了什么?: <GridViewColumn>    <GridViewColumn.CellTemplate>       <DataTemplate>          <Button>            <Button.ToolTip>              <TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource AncestorType=Window}}" />那只是一个简化的示例,无论如何都不起作用:)实际上,我需要从Window的DataContext范围内的另一个属性中获取一个值。请帮助我。
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

如下所示:

PlacementTarget是拥有ContextMenu的控件(例如:DataGrid)。不需要“标签”属性。


IsEnabled绑定到DataGrid的“ myProperty”值。


我对此进行了测试,并且可以正常工作。绑定存在类似问题。


<ContextMenu

DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}"

IsEnabled="{Binding myProperty}"  

>


查看完整回答
反对 回复 2019-10-21
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

因为ContextMenu不在可视树中,所以绑定将不起作用。一个简单的解决方案是使用代理模式,你可以创建一个继承的包装类DependencyObject,并具有DependencyProperty将保持DataContext你的Window,那么你可以在XAML代理的资源,最后你的绑定MenuItem通过代理命令添加到您所需的命令宾语。

样本代理:


Public class ProxyClass : DependencyObject

{

    Public object Data {get; set;}

   public static readonly DependencyProperty DataProperty = DependencyProperty.Register("DataProperty", typeof(object), typeof(ProxyClass), new FrameworkPropertyMetadata(null));


}

如何在XAML中使用:


<Window DataContext="{Binding MyViewModel}">

...

<Window.Resources>

    <ProxyClass Data={Binding} x:Key="BindingProxy"/>


</Window.Resources>

...  

<MenuItem Command="{Binding Source={StaticResource BindingProxy}, Path=Data.MyDesiredCommand"/>

...

</Window>

怎么了?

Data财产ProxyClass将绑定到DataContext的Window,那么它所有的comamnds和你的属性ViewModel的内部ProxyClass资源。

这种方法的另一个好处是可移植性,并且可以在多个视图和项目中重复使用。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 685 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信