Как я могу запустить 2 команды в 1 кнопке - PullRequest
0 голосов
/ 19 июня 2020

Я разрабатываю игру, которая хочет проверить, решена ли определенная головоломка или нет. Эта головоломка находится внутри UserControl, и если она будет решена, я хочу показать другой UserControl.

Метод изменения одного UserControl1 на UserControl2 находится внутри MainWindowViewModel, и я смог решить эту проблему с помощью этой команды :

Button 1:
<Button Content="Grid" Command="{Binding DataContext.NavigateCommand, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}, Mode=OneWay}" CommandParameter="5" />

Лог c должен передать Puzzle как переменную и позволить второму UserControl проверить, решена ли головоломка, но с учетом того, как эта команда закодирована в MainViewModel, что не т возможно. MainViewModel выглядит так:

    public class MainViewModel : ViewModelBase, INotifyPropertyChanged
    {
        private IPage content;
        public IPage Content { get => content; protected set => Set(ref content, value); }
        public RelayCommand<int> NavigateCommand => new RelayCommand<int>(Navigate);

        private readonly Dictionary<int, Lazy<IPage>> pages = new Dictionary<int, Lazy<IPage>>
        {
            [1] = new Lazy<IPage>(() => new IntroViewModel()),
            [2] = new Lazy<IPage>(() => new ChoosePuzzleViewModel()),
            [3] = new Lazy<IPage>(() => new GameViewModel(5)),
            [4] = new Lazy<IPage>(() => new GameViewModel(7)),
            [5] = new Lazy<IPage>(() => new GameViewModel(9)),
            [6] = new Lazy<IPage>(() => new ResultViewModel())
        };

        public MainViewModel() => Navigate(1);

        public void Navigate(int value) => Content = pages[value].Value;
    }

Итак, решение, которое я пытаюсь применить, - позволить PuzzleViewModel проверять правильность головоломки с помощью кнопки, вот так:

Button 2:
<Button Name="SolveButton" Content="Check" Height="80" Width="100" Command="{Binding VMPuzzle.SolvedCheck}" />

И в зависимости от результата, возвращаемого этой командой, запустите команду Button 1 . Необязательно, чтобы вторая команда была в кнопке, это для целей иллюстрации.

Итак, вопрос в том, может ли одна кнопка запускать две команды, одну за другой?

1 Ответ

0 голосов
/ 19 июня 2020

Вы можете выполнить «NavigateCommand» из модели ViewModel VMPuzzle, если у вас есть ссылка на ваш класс MainViewModel. Вы можете запустить команду с помощью

NavigateCommand.Execute ();

Было бы полезно увидеть реализацию класса VMPuzzle.

Пример:

public class VMPuzzle
{
    MainViewModel _mainViewModel;

    public VMPuzzle(MainViewModel mainViewModel)
    {
        _mainViewModel = mainViewModel;
    }

    private void CallExecuteCommandInMainViewModel()
    {
        _mainViewModel.NavigateCommand.Execute();
    }
}

CallExecuteCommandInMainViewModel (); будет вызываться из команды SolvedCheck в вашем классе VMPuzzle, или вы напрямую запускаете ее с помощью _mainViewModel.NavigateCommand.Execute (); без метода.

Я предполагаю, что у вас есть прямой доступ к вашей MainViewModel, поэтому вы можете напрямую вызывать NavigateCommand.Execute (); в вашем SolvedCheckCommand. Из-за привязки, которую я вижу в вашем примере: Command = "{Binding VMPuzzle.SolvedCheck}"

В качестве альтернативы вы можете работать с EventHandler, как в этом примере "Я не реализовал сами команды в этом примере, но выполнял void:

РЕДАКТИРОВАТЬ: добавлены аннотации только для пояснения

using System;

namespace Testproject
{
    public class MainViewModel
    {
        public MainViewModel()
        {
            // Subscribe to the event in VMPuzzle but dont forget to unsuscribe later if needed!
            var vm_Puzzle = new VMPuzzle();
            vm_Puzzle.SolvedCheck += Vm_Puzzle_SolvedCheck;
        }

        /// <summary>
        /// <see cref="VMPuzzle.Execute_CommandSolvedCheck(object)"/> 
        /// got executed so we want to do something after that.
        /// In this example we execute another command
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Vm_Puzzle_SolvedCheck(object sender, EventArgs e)
        {
            // Fire the Navigate Command
            // NavigateCommand.Execute();
        }
    }

    public class VMPuzzle
    {
        public VMPuzzle()
        {
            doStuff();
        }

        /// <summary>
        /// The Method which gets executed from the Command
        /// </summary>
        /// <param name="Parameter"></param>
        private void Execute_CommandSolvedCheck(object Parameter)
        {
            OnSolvedCheck(EventArgs.Empty);
        }

        /// <summary>
        /// Execute_CommandSolvedCheck is completely executed, inform subscribers if there are some
        /// </summary>
        /// <param name="e"></param>
        private void OnSolvedCheck(EventArgs e)
        {
            SolvedCheck?.Invoke(this, new EventArgs());
        }

        /// <summary>
        /// Just a standard Method we fire
        /// </summary>
        public void doStuff()
        {
            OnSolvedCheck(EventArgs.Empty);
        }

        public event EventHandler SolvedCheck;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...