Реализация команд и жизненный цикл - PullRequest
0 голосов
/ 09 августа 2011

Я новичок в wpf и командах и хотел бы получить несколько полезных советов, касающихся того, когда и как создаются пользовательские классы команд:

Должно ли _canExecute быть статическим или нет?

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

ExitCommand является частью словаря ресурсов приложения

<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 Ответ

1 голос
/ 09 августа 2011

Я не вижу никаких экземпляров в вашем фрагменте XAML, но если вы объявите его непосредственно в Application.Resources (без установки x:Shared в false), то обычно будет только один экземпляр через всего приложения, но это не может быть гарантировано, так как мы имеем дело со словарем, поэтому вы всегда можете поменять экземпляр, найденный с помощью этого конкретного ключа.

В этом случае нет никакой реальной необходимости делать поле статичным (если вы подозреваете, что подделка словаря может потребоваться), во всяком случае, я бы создал команду статически и только для чтения в статическом классе, где она может быть легкий доступ (используя x:Static в XAML и обычный путь доступа в коде позади).

Также уже есть ApplicationCommands, которые можно использовать вместо вашей пользовательской команды. И вы также можете добавить свой собственный класс App, который затем может быть связан с использованием {Binding ExitCommand, Source={x:Static local:App.Current}}, может быть немного более многословным, но команда ближе к месту, где он принадлежит, и у вас также, безусловно, будет правильный экземпляр.

...