首页 > 代码库 > WPF ContextMenu 在MVVM模式中无法绑定 Command的解决办法

WPF ContextMenu 在MVVM模式中无法绑定 Command的解决办法

ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Binding}”是行不通的

不能绑父级,但是能绑资源

第一步:定义一个中间类用来做资源对象

 1 public class BindingProxy : Freezable 2     { 3         #region Overrides of Freezable 4  5         protected override Freezable CreateInstanceCore() 6         { 7             return new BindingProxy(); 8         } 9 10         #endregion11 12         public object Data13         {14             get { return (object)GetValue(DataProperty); }15             set { SetValue(DataProperty, value); }16         }17 18         public static readonly DependencyProperty DataProperty =19             DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));20     }

第二步:引用命名空间,在控件中定义资源

1 <UserControl.Resources>2         <libBinding:BindingProxy x:Key="BindingProxy" Data=http://www.mamicode.com/"{Binding}"/>3     </UserControl.Resources>

第三步:绑定ContextMenu、MenuItem

(Button.Command 和 ContextMenu.IsOpen 的绑定部分可以不关注,这两个绑定是用来控制ContextMenu打开的)

 1 <Button Command="{Binding Customfold}"> 2             <Button.ContextMenu> 3                 <ContextMenu DataContext="{Binding Data,Source={StaticResource BindingProxy}}"   4                              ItemsSource="{Binding ItemModelCollection}" 5                              IsOpen="{Binding OpenCustomfold,Mode=OneWay}"> 6                     <ContextMenu.ItemContainerStyle> 7                         <Style TargetType="MenuItem"> 8                             <Setter Property="Header" Value=http://www.mamicode.com/"{Binding ...}"/> 9                             <Setter Property="Command" Value=http://www.mamicode.com/"{Binding ...}"/>10                             <Setter Property="CommandParameter" Value=http://www.mamicode.com/"{Binding ...}"/>11                         </Style>12                     </ContextMenu.ItemContainerStyle>13                 </ContextMenu>14             </Button.ContextMenu>15             <Image .../>16         </Button>

参考:

http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

http://stackoverflow.com/questions/1580753/wpf-contextmenu-with-itemssource-how-to-bind-to-command-in-each-item

WPF ContextMenu 在MVVM模式中无法绑定 Command的解决办法