gpt4 book ai didi

c# - 上下文菜单绑定(bind)永远不会被执行

转载 作者:行者123 更新时间:2023-12-03 10:26:44 25 4
gpt4 key购买 nike

我的 View 中有 ListView 控件和它自己的 View 模型 A。我制作了一个单独的 UserControl 用作 ListViewItem,因为它的样式需要很多空间。在这个 ListViewItem 中,我有一个按钮,它绑定(bind)到 viewmodel A 并且工作正常。

由于上下文菜单有它自己的可视化树并且不能通过祖先绑定(bind),所以我使用了 binding proxy , 来解决这个问题。我对其进行了一些调整,因此它适用于我的特定情况,因为如果它只使用 {Binding} 它将绑定(bind)到项目的模型,而不是 ListView 的 View 模型。

<helpers:BindingProxy x:Key="proxy" Data="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/>

为了检查绑定(bind)是否正确,我使用了转换器作为一种方法,只是为了有一个断点来检查源代码。一切都很好,我在那里得到了我的 View 模型。

现在,当我尝试在上下文菜单中绑定(bind)到 this
<UserControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Open"
Command="{Binding DataContext.OpenChatCommand, Source={StaticResource proxy}, Converter={StaticResource DataBindingDebugConverter}}"
CommandParameter="{Binding}"/>
</ContextMenu>
</UserControl.ContextMenu>

该命令永远不会被调用。我添加了转换器以查看是否有问题,但事实证明,我从来没有使用过我的转换器,这反过来意味着这段代码永远不会被执行。

欢迎任何对为什么会发生这种情况以及如何解决此问题有任何想法的人。

我认为这是编译器出现故障

最佳答案

我刚刚对你提到的那个“绑定(bind)代理”做了一个简短的阅读,但据我所知,DataGridTextColumnDataGrid 位于同一可视树中,只是它的DataContext绑定(bind)到它的数据。
对于 ContextMenu ,完全不同。这棵树确实与其父树有一棵不同的树。在资源中使用代理对象是没有意义的,因为它来自不同的可视化树。当您使用 StaticResource , WPF 将在这些元素的 Resource 中逐级向上搜索其可视化树属性(即 ResourceDictionary )。
一种方法是将该代理设置为单例,并使用 Source={x:Static helpers:BindingProxy.Instance} .当然使用这个意味着你的代理只能被一个 View 使用,否则会发生一些意想不到的事情。
另一种方法是使用 PlacementTarget ContextMenu 的属性(property).

<ContextMenu DataContext="{Binding Path=PlacementTarget.DataContext,
RelativeSource={RelativeSource Self}}">
这是首选方式,但您需要确保 parent 的 DataContext确实是您需要的虚拟机。
编辑
MVVM 方式没有 super 优雅的方式。最好的方法可能是通过使用 Tag 属性(property)。
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag,
RelativeSource={RelativeSource Self}}">
ListView 控件:
<MyControl:MyListViewItem .... Tag="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type MyControl:MyListViewView}}}"}" ...>

关于c# - 上下文菜单绑定(bind)永远不会被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com