当前位置: 首页 > 编程语言 > C#

WPF-BindingContextMenutoMVVMCommand分享

时间:2023-04-11 02:13:14 C#

WPF:BindingContextMenutoMVVMCommand尽可能简单地重现问题)。以下作品:但以下作品不起作用。我收到的错误消息是System.Windows.DataError:4:Couldnotfindabindingsourcereferenceing'ElementName=myWindow'。绑定表达式:路径=我的命令;数据项=NULL;目标元素是'MenuItem'(Name=");目标属性是'Command'(类型'ICommand')为什么?我该如何解决?使用DataContext不是一个选项,因为这个问题发生在可视树下DataContext已经包含正在显示的实际数据。我尝试使用{RelativeSourceFindAncestor,...},但这会产生类似的错误消息。问题是ContextMenu不在可视化树中,因此您基本上必须告诉关于使用哪个数据上下文的上下文菜单。查看这篇博文,其中包含来自ThomasLevesque的一个非常好的解决方案。他创建了一个具有inheritanceFreezable的Proxy类,并声明了一个数据依赖属性。公共类BindingProxy:Freezable{protectedoverrideFreezableCreateInstanceCore(){returnnewBindingProxy();}publicobjectData{get{return(object)GetValue(DataProperty);}set{SetValue(DataProperty,value);}}publicstaticreadonlyDependencyPropertyDataProperty=DependencyProperty.Register("Data",typeof(object),typeof(BindingProxy),newUIPropertyMetadata(null));然后它可以在XAML中声明(其中正确的DataContext在可视化树中已知):并在可视化树外的上下文菜单中使用它:为web.archive.org欢呼吧!这是缺少的博文:绑定到WPF上下文菜单中的MenuItem2008年10月29日,星期三–jtango18因为WPF中的ContextMenu不存在于页面/窗口/控件本身的可视化树中,所以数据绑定是可能的这有点棘手.我在网上搜索了高低,最常见的答案似乎是“只在代码后面做”。错误!我不会进入XAML的美妙世界并退回到在代码隐藏中做事。这是我的示例,它允许您绑定到作为窗口属性存在的字符串。publicpartialclassWindow1:Window{publicWindow1(){MyString="这是我的字符串";}公共字符串MyString{得到;放;}}重要的部分是按钮上的标签(尽管您可以轻松设置按钮的DataContext)。这将存储对父窗口的引用。ContextMenu可以通过其PlacementTarget属性访问它。然后,您可以通过菜单项向下传递此上下文。我承认这不是世界上最优雅的解决方案。但是,它会覆盖隐藏代码中的设置。如果有人有更好的方法来做到这一点,我很想听听。我发现它对我不起作用,因为菜单项是嵌套的,这意味着我必须遍历额外的“父项”才能找到PlacementTarget。更好的方法是找到作为RelativeSource的ContextMenu本身,然后绑定到它的放置目标。此外,由于标记是窗口本身,而您的命令位于视图模型中,因此您还需要设置DataContext。我最终得到了这样的东西......这意味着如果你最终得到一个带有子菜单等的复杂上下文菜单......你不需要为每个级别的命令添加“父级”。--编辑--还提出了这个替代方案,在每个ListBoxItem上设置一个标志,绑定到Window/Usercontrol。我最终这样做是因为每个ListBoxItem都由它们自己的ViewModel表示,但我需要通过顶级ViewModel为控件执行菜单命令,但将它们的列表ViewModel作为参数传递。>...请参阅JustinTaylor的这篇文章以了解解决方法。更新遗憾的是,引用的博客不再可用。我试图用另一个SO答案来解释这个过程。在这里能找到它。根据HCL的回答,这就是我最终使用的内容:...如果您(像我一样)讨厌丑陋的复杂绑定表达式,那么这里有一个简单的代码隐藏解决方案来解决这个问题。此方法仍然允许您在XAML中保持干净的命令声明。XAML:...代码背后:以上就是C#学习教程:WPF:BindtheContextMenutotheMVVMcommand全部内容分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——if(itemisMenuItem){//将命令目标设置为您在这里喜欢的任何内容(itemasMenuItem).CommandTarget=this;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: