如何从UserControl公开ICommand属性

时间:2014-03-17 06:39:20

标签: wpf

我的MainWindow应用程序正在使用UserControl。 UserControl在完成内部任务后触发事件。我现在希望我的MainWindow应用程序通过ICommand处理此事件。

我认为这可以通过在UserControl上实现一个ICommand作为DependencyObject来完成,然后由MainWindow绑定到它。

我是否远远不够?

是否有一个示例来展示我如何使用MVVM做到这一点?

由于

1 个答案:

答案 0 :(得分:1)

另一种方法是创建附加到UserControl触发的事件的行为。 在事件处理程序内部,该行为将执行ViewModel的ICommand

您可以在此处找到附加到SizeChanged的{​​{1}}事件的自定义行为:

FrameworkElement

然后,您可以通过以下方式将行为附加到UserControl:

public class FrameworkElementSizeChangedBehaviour
{
    public static void SetFrameworkElementSize(DependencyObject obj, ICommand value)
    {
        obj.SetValue(FrameworkElementSizeChangedBehaviour.FrameworkElementSizeProperty, value);
    }

    public static readonly DependencyProperty FrameworkElementSizeProperty = DependencyProperty.RegisterAttached("FrameworkElementSize",
                                    typeof(ICommand),
                                    typeof(FrameworkElementSizeChangedBehaviour),
                                    new UIPropertyMetadata(FrameworkElementSizeChanged));

    private static void FrameworkElementSizeChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement element = target as FrameworkElement;

        if (element == null)
            throw new InvalidOperationException();

        if ((e.NewValue != null) && (e.OldValue == null))
        {
            element.SizeChanged += element_SizeChanged;

        }
        else if ((e.NewValue == null) && (e.OldValue != null))
        {
            element.SizeChanged -= element_SizeChanged;
        }
    }

    static void element_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)sender;
        ICommand command = (ICommand)element.GetValue(FrameworkElementSizeChangedBehaviour.FrameworkElementSizeProperty);

        if (command != null)
        {
            Size args = new Size(element.ActualWidth, element.ActualHeight);

            if (command.CanExecute(args))
            {
                command.Execute(args);
            }
        }
    }
}

其中<MyUserControl mybehaviournamespace:FrameworkElementSizeBehaviour.FrameworkElementSize="{Binding ICommandToBeExecuted}" /> 表示在您的UserControl事件被触发时要调用的ViewModel的ICommandToBeExecuted