父mvvm上的附加行为不起作用

时间:2013-02-23 13:01:16

标签: c# wpf attachedbehaviors

我有2个Usercontrols,父母和孩子,子控件有按钮女巫我想用父viewmodel方法点击,但它不起作用,请告诉我我错过了什么 在父视图中,我有这样的事情:

XAML
...
<view:childUC vm:ChildBehaviuor.AddCommand="{Binding ExampleCommand}"/>

行为代码:

        public static readonly DependencyProperty AddCommandProperty =DependencyProperty.RegisterAttached
    (
     "AddCommand",
     typeof(ICommand),
     typeof(childBehavior),
     new PropertyMetadata(OnAddCommand)
    );
    public static ICommand GetAddCommand(DependencyObject obj)
    {
        return (ICommand)obj.GetValue(AddCommandProperty);
    }
    public static void SetAddCommand(DependencyObject obj, ICommand value)
    {
        obj.SetValue(AddCommandProperty,value);
    }

private static ICommand command;

private static void OnAddCommand(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            child gp = sender as child;
            childBehavior.command = (ICommand)sender.GetValue(childBehavior.AddCommandProperty);

            if(gp != null && command != null)
            {
                if ((e.NewValue != null) && (e.OldValue == null))
                {
                    gp.AddButton.Click += ButtonClick;
                }
                else if ((e.NewValue == null) && (e.OldValue != null))
                {
                    gp.AddButton.Click -= ButtonClick;
                }
            }
        }
        public static void ButtonClick(object sender,RoutedEventArgs eventArgs)
        {
            childBehavior.command.Execute(null);    
        }

VM父命令:

        public ICommand ExampleCommand
    {
        get
        {
            if (this.exampleCommand == null)
            {
                this.exampleCommand  = new DelegateCommand(...);
            }

            return this.exampleCommand ;
        }
    }

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你,但如果您正在寻找一种方法在您的子用户控件上执行命令,当您单击父用户控件中的按钮时,您需要执行以下操作:

  1. 让您的父用户控件实现ICommandSource接口,该接口包含一个名为“Command”的属性。
  2. 将您的子usercontrol中的某个命令绑定到“Command”属性,该属性在您实现ICommandSource接口后将在您的父用户控件上可用。
  3. 当您单击父用户控件中的按钮时,访问按钮处理程序内部,该处理程序是父用户控件中的一种方法,即通过界面获得的可用命令属性。访问Command属性后,调用Command.Execute()方法,该方法将转到您的子用户控件并触发之前绑定的命令。
  4. 如何从父usercontrol对子usercontrol执行命令..如果你想要它反过来你只需要用parent替换每个子单词,并用子表示每个父单词:)