代码之家  ›  专栏  ›  技术社区  ›  Jesus Rodriguez

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

  •  30
  • Jesus Rodriguez  · 技术社区  · 16 年前

    我浏览了一下这个网站和谷歌,但这些解决方案对我来说并不管用。

    我在用户控件的ViewModel上有一个命令。好吧,用户控件有一个itemsControl绑定到一个可观察的集合。在itemscontrol.itemtemplate的datatemplate中,我有一个按钮,我想使用该命令。我无法绑定该命令,因为在DataTemplate中,DataContext不是ViewModel,而是ObservableCollection的项。

    问题是:如果a丢失了父数据上下文,如何将按钮绑定到命令?

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

    想象一下这个场景:

    您有一个以ObservableCollection作为itemsSource的列表框项,因此您在列表框内为集合中的每个元素使用一个数据模板。好吧,您要删除所选项目,并在该作业的每一行中放置一个按钮。你是怎么做到的?

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

    Button but = e.Source as Button;
    
    if (but != null)
          Presenter.ActualNote = but.DataContext as Note;
    

    简而言之。将行的数据上下文(选定项)发送给演示者。

    但是,我怎样才能用MVVM的方式来实现呢?因为我需要使用一个命令,但是我不能将该命令分配给按钮,因为按钮对视图模型一无所知(命令存在的地方)。

    如您所见,该按钮必须存在于DataTemplate中,然后DataContext不再是ViewModel….这就是为什么我需要访问父级的DataContext才能访问该命令。

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

    谢谢您。

    4 回复  |  直到 9 年前
        1
  •  5
  •   geofftnz    16 年前

    如果您想要一个脏的、MVVM中断的解决方案,那么在按钮上设置tag=“binding”,并处理click事件。在事件处理程序中,对ViewModel调用命令。

        2
  •  89
  •   Indy9000    12 年前

    将下面的绑定用于按钮的命令:

    {Binding DataContext.CommandName, 
             RelativeSource={RelativeSource FindAncestor, 
                             AncestorType={x:Type MyUserControl}}}
    

    这将告诉它找到您的用户控件并使用它的DataContext。

        3
  •  3
  •   Dmitry Tashkinov    16 年前

    相对资源是可行的,但我认为让控件在彼此的属性之间徘徊是不对的。奇怪的是,放置在项视图中的按钮使用外部数据源而不是绑定项执行某些操作。您可能需要检查程序代码的设计。

        4
  •  3
  •   Dmitry Tashkinov    16 年前

    好的,那么修改数据项类,使其具有引用整个模型视图的属性,怎么样?

    如果您的项源属于类型 ObservableCollection<DataItem> 然后像这样修改数据项类型:

    public class DataItem
    {
        public BusinessObject Value { get; set; }
    
        private ModelView modelView;
    
        public ModelView ModelView
        {
            get
            {
                return modelView;
            }
        }
    
        public DataItem(ModelView modelView)
        {
            this.modelView = modelView;
        }
    }