WPF ContextMenu 的绑定和传参问题

 在ListView列表中,存在多个项目,每个项目都需要右键菜单进行操作。这时一般情况下定义的采用以下方式:即在模板中定义的控件内(在当前示例中是Border),定义一个ContextMenu。Command在ViewModel中定义。

 
 
      
  
                

     

          
        
              
                 
                    
                  
        
    
  


运行后会报找不到绑定的命令DeleteCmd。熟悉WPF绑定的话,会想过使用RelativeSource Mode=FindAncestor让它在上级控件的逻辑树中找。

遗憾的是 ContextMenu不存在于当前控件的逻辑树,它有自己的逻辑树,无法通过向上控件找到DataContext的命令。在找了许多资料后,微软给的方案是使用BindingProxy继承自Freezable。

    public class BindingProxy : Freezable
    {
        #region Overrides of Freezable

        protected override Freezable CreateInstanceCore()
        {
            return new BindingProxy();
        }

        #endregion

        public object Data
        {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }

        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy),             new UIPropertyMetadata(null));
    }

        在前台代码使用,同时使用CommandParameter传递当前选中项的数据到命令中:

     
         
          
           
             
                  
              
                   
                    
                   

           
   
   
    

  

                  

不足之处 

使用这种方式虽然每个子项都可以绑定到父级控件中的命令,但是过于繁琐。一直在想办法替换掉这种麻烦的方法。

另外一种简单的方式(不绑定参数的情况下):

       直接在ListView中定义一个ContextMenu而不在ListView子项的ItemTemplate中创建。使用这种方式会简单很多。

代码如下:

                

   
          
              
                
                  
                
          




    
     
     
  


使用这种方式,不需要在DataTemplate都创建ContextMenu,没有BindingProxy 。但是对于MenuItem命令需要绑定参数的话不是很友好 ,如果仍需要绑定,建议还是使用第一种方式。

你可能感兴趣的:(WPF,C#,wpf,microsoft,c#)