命令实例化和生命周期

时间:2011-08-09 16:43:05

标签: wpf xaml resourcedictionary

我是wpf和命令的新手,想要一些有关何时/如何实例化自定义命令类的工具建议:

_canExecute应该是静态的吗?

public class ExitCommand : ICommand
{
    static bool _canExecute = true;
    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }
    ...
}

ExitCommand是App Resource Dictionary的一部分

<Application.Resources>        
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source=".....
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>        
</Application.Resources>

ExitCommand位于StaticResource

<MenuItem Header="Exit" Command="{StaticResource ExitCommand}"/>

如果我想用_canExecute控制CanExecute,如果我非静态地声明布尔值,它的值是否会存活?或者换句话说,何时实例化ExitCommand:

  1. 每当加载应用程序资源时,每个应用程序会话只会实例化一次吗?

  2. 每次触发命令时,例如,ExitCommand都会被实例化。点击退出菜单项?

1 个答案:

答案 0 :(得分:1)

我无法在您的XAML代码段中看到任何实例化,但如果您直接在Application.Resources中声明它(未将x:Shared设置为false),通常只会有一个实例整个应用程序,但这不能保证,因为我们正在处理字典,所以你总是可以换掉使用该特定密钥找到的实例。

在这种情况下,没有必要使字段静态(如果你怀疑你可能想要篡改字典),如果有什么我会在静态类中静态地和只读地创建命令它可以是轻松访问(在XAML中使用x:Static,在后面的代码中使用普通访问路径)。

此外,还有ApplicationCommands,可以使用它来代替您的自定义命令。你也可以将你自己添加到App类本身,然后可以使用{Binding ExitCommand, Source={x:Static local:App.Current}}绑定,可能会更加冗长,但命令更接近它所属的位置,你当然也有正确的实例。