iLe*_*ing 30 wpf xaml binding relativesource
我在这做错了什么?:
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button>
<Button.ToolTip>
<TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource AncestorType=Window}}" />
Run Code Online (Sandbox Code Playgroud)
这只是一个简单的例子,无论如何都不起作用:)实际上我需要从Window的DataContext范围内的另一个属性中获取一个值.
帮帮我吧
HCL*_*HCL 71
这很棘手,因为ToolTip不是VisualTree的一部分.在这里,您可以看到与ContextMenus相同问题的一个很酷的解决方案.您可以使用与工具提示相同的方式.
更新
可悲的是链接已经消失,我还没有找到引用的文章.
据我所知,引用的博客已经展示了如何绑定到另一个VisualTree的DataContext,这在从ToolTip,ContextMenu或Popup进行绑定时经常是必需的.
一个很好的方法是在PlacementTarget的Tag-property中提供所需的实例(例如ViewModel).以下示例用于访问ViewModel的Command实例:
<Button Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding PlacementTarget.Tag.DesiredCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" .../>
<ContextMenu>
</Button.ContextMenu>
</Button>
Run Code Online (Sandbox Code Playgroud)
我没有测试它,很长一段时间我最后一次这样做了.如果它不适合您,请发表评论.
更新2
由于这个答案的原始链接已经消失,我点击了archive.org并找到了原始的博客条目.这是博客的逐字:
因为WPF中的ContextMenu不存在于页面/窗口/控件本身的可视化树中,所以数据绑定可能有点棘手.我已经在网上搜索了高低,最常见的答案似乎是"只是在后面的代码中执行".错误!我没有进入XAML的精彩世界,回到后面的代码中做事.
这是我的示例,它允许您绑定到作为窗口属性存在的字符串.
Run Code Online (Sandbox Code Playgroud)public partial class Window1 : Window { public Window1() { MyString = "Here is my string"; } public string MyString { get; set; } } <Button Content="Test Button" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"> <Button.ContextMenu> <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" > <MenuItem Header="{Binding MyString}"/> </ContextMenu> </Button.ContextMenu> </Button>
重要的部分是按钮上的标签(尽管您可以轻松设置按钮的DataContext).这将存储对父窗口的引用.ContextMenu能够通过它的PlacementTarget属性访问它.然后,您可以通过菜单项向下传递此上下文.
我承认这不是世界上最优雅的解决方案.但是,它在背后的代码中胜过设置.如果有人有更好的方法来做到这一点,我很乐意听到它.
如下所示:
PlacementTarget 是拥有 ContextMenu 的控件(例如:DataGrid)。不需要“标签”属性。
IsEnabled 绑定到 DataGrid 的“myProperty”值。
我测试了这个并且它有效。绑定有类似的问题。
<ContextMenu
DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}"
IsEnabled="{Binding myProperty}"
>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18010 次 |
最近记录: |