Выполнить одну и ту же команду Prism из разных ViewModels - PullRequest
1 голос
/ 08 марта 2012

Можно ли как-то выполнить одну Команду из разных ViewModels в приложении WPF с использованием Prism?

Позвольте мне объяснить, что я имею в виду.

У меня есть класс MainMenuViewModel:

public class MainMenuViewModel
{
    private ICommand _aboutCommand;
    public ICommand AboutCommand
    {
        get
        {
            if (_aboutCommand == null)
            {
                _aboutCommand = new DelegateCommand(() => 
                    { MessageBox.Show("About menu item clicked!"); });
            }

            return _aboutCommand;
        }
    }
}

также есть представление для этой модели:

<Menu IsMainMenu="True">
    <MenuItem Header="Nápověda">
        <MenuItem Header="O Aplikaci" x:Name="About" 
                  Command="{Binding AboutCommand}" />
    </MenuItem>
</Menu>

В приложении есть другой модуль, который должен выполнить команду с таким же поведением (или, возможно, даже лучше - той же командой).):

public class MunisatorViewModel
{
    private ICommand _aboutCommandInAnotherModule;

    public ICommand AboutCommandInAnotherModule
    {
        get
        {
            if (_aboutCommandInAnotherModule== null)
            {
                _aboutCommandInAnotherModule= new DelegateCommand(() =>
                    { MessageBox.Show("About menu item clicked!"); });
            }

            return _aboutCommandInAnotherModule;
        }
    }
}

этот модуль имеет вид:

<StackPanel Background="White" HorizontalAlignment="Center" VerticalAlignment="Top">
    <Button cmd:Click.Command="{Binding AboutCommandInAnotherModule}">About</Button>
</StackPanel>

Можно ли избежать дублирования кода?

PS Я понимаю, что могу создать базуКласс для этих двух ViewModels и описать там эти Команды, но проблема в том, что некоторые из ViewModels уже имеют разные базовые классы.

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Используйте EventAggregator, чтобы вызвать подобные события.Это позволяет вам иметь слабосвязанную связь между различными областями пользовательского интерфейса.

Концепция публикации / подписки, передача данных через реализацию объекта CompositeEvent работает хорошо.

В качестве альтернативы, вы можете сделать свою командуСтатический и доступ к нему из разных областей, но это не так уж и приятно.

Документация Prism подробно описывает ваши варианты.

Надеюсь, это поможет.

0 голосов
/ 11 марта 2012

Может быть, вы могли бы реорганизовать ваш AboutCommand в отдельный класс / объект, который затем можно было бы внедрить в обе модели представления (конструктор, сеттер ...).Таким образом, каждая модель представления будет просто передавать ссылку на объект команды, и будет иметься повторяющийся код по цене «аутсорсинга» вашей логики AboutCommand из вашей основной модели представления.

Другим более статичным способом может быть использованиекомандный прокси, который содержит CompositeCommands, например ваш AboutCommand.Затем вы можете зарегистрировать (или несколько) реализаций для команды about.

Надеюсь, это поможет.

...