我的MainWindow应用程序正在使用UserControl。 UserControl在完成内部任务后触发事件。我现在希望我的MainWindow应用程序通过ICommand处理此事件。
我认为这可以通过在UserControl上实现一个ICommand作为DependencyObject来完成,然后由MainWindow绑定到它。
我是否远远不够?
是否有一个示例来展示我如何使用MVVM做到这一点?
由于
答案 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
。