WPF - 自定义控件 + ICommand(如何实现)?

3
基本上,我有一个自定义控件FooControl
public class FooControl : ItemsControl
{
    //Code
}

我需要添加一些事件处理,但我更喜欢使用Commanding而不是使用RoutedEvent。然而,我不确定如何实现。如果我希望当Bar1Property(DependencyProperty)更改时,它会触发相关的Execute属性,该怎么办?我通过.NET Reflector查看了ButtonBase代码,感觉非常复杂。添加命令是否就这么复杂?显然,我还需要使我的控件根据CanExecuteChanged属性的更改启用/禁用其某些部分。但我想这应该是另一个部分。
以下是我的OnBar1Changed函数:...
    private static void OnBar1Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        FooControl element = (FooControl)obj;
        //What to do here?
    }
2个回答

5
听起来你想在自定义控件中支持命令(例如Button支持)。为了做到这一点,我建议你查看如何实现ICommandSource。微软提供了一个很好的演示,告诉你如何自己实现它:http://msdn.microsoft.com/en-us/library/ms748978.aspx

是的,这就是我在寻找的...一个自定义控件的默认命令。我查看了ButtonBase,发现它有很多关于ICommandSource的混乱代码。 - michael
抱歉,我不确定我理解了这个问题 - 你是在问我一个问题还是只是说我用文章回答了你的问题?如果你想知道ButtonBase有多少是为ICommandSource准备的,那么它将包括该文章中显示的所有部分。这些是你需要实现的内容。 - Matt West
1
该评论不是一个问题,只是对ButtonBase的混乱程度作出的陈述。 - michael

3

在最简单的层面上,你所需要的只是像这样的东西:

FooControl element = obj as FooControl;
if (element == null) return;

if (element.MyCommand != null && element.CanExecute(this.CommandParameter) 
{
  element.MyCommand.Execute(this.CommandParameter);
}

您需要为命令和命令参数分别创建依赖属性。希望对您有所帮助。

请注意,CommandParameter 不是必需的,也不一定要检查 CanExecute。尤其是如果您希望其他人重用您的控件,那么最好采取这种做法。但是,如果您不需要它们,可以直接执行命令。 - Hugh W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接