使用父级的DataContext(WPF - 动态菜单命令绑定)

Jes*_*uez 30 c# wpf menu dynamic commandbinding

我查看了这个网站和谷歌,解决方案对我不起作用.

我在UserControl的ViewModel上有一个命令.好吧,usercontrol有一个绑定到ObservableCollection的ItemsControl.在ItemsControl.ItemTemplate的DataTemplate中,我有一个按钮,我想使用该命令.我无法绑定命令,因为在DataTemplate中,datacontext不是ViewModel而是ObservableCollection的项.

问题是:如果丢失了父datacontext,如何将按钮绑定到命令?

我认为这需要一个简单的解决方案,因为我认为这是一个常见的问题.

想象一下这个场景:

您有一个带有observableCollection的ListBox项作为ItemsSource,因此您在ListBox中为集合中的每个元素使用了一个datatemplate.好吧,您想删除所选项目,并在该行的每一行中放置一个按钮.你是怎样做的?

在MVP中,我可以在按钮的单击事件中执行此操作:

Button but = e.Source as Button;

if (but != null)
      Presenter.ActualNote = but.DataContext as Note;
Run Code Online (Sandbox Code Playgroud)

简而言之.您将行的datacontext(所选项目)发送到演示者.

但是,我怎么能用mvvm方式呢?因为我需要使用命令但是我无法将命令分配给按钮,因为该按钮对ViewModel(命令所在的位置)一无所知.

正如您所看到的,按钮必须存在于datatemplate中,然后datacontext不再是ViewModel ....这就是我需要访问父级DataContext以访问命令的原因.

我希望你能更好地理解我的问题.

谢谢.

Edd*_*eyo 89

使用下面的绑定作为按钮的命令:

{Binding DataContext.CommandName, 
         RelativeSource={RelativeSource FindAncestor, 
                         AncestorType={x:Type MyUserControl}}}
Run Code Online (Sandbox Code Playgroud)

这将告诉它找到你的UserControl并使用它的DataContext.

  • 太棒了,像魅力一样!作为旁注:如果您仍希望保留按钮的数据上下文以传递给命令绑定,请使用CommandParameter ="{Binding Path =.}"这样,参数对象就是控件的上下文. (2认同)

geo*_*tnz 5

如果你想要一个破坏性的MVVM解决方案,那么在按钮上设置Tag ="{Binding}"并处理Click事件.在事件处理程序中,在ViewModel上调用该命令.

  • 我是SL开发人员,所以打破mvvm是课程的标准:) (2认同)