首页 > 代码库 > 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的解决办法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。