WPF: реализовать команду кнопки MVVM - PullRequest
0 голосов
/ 15 февраля 2019

Так что у меня есть WPF приложение с основными виндами и 2 UserControls:

  1. HomeView.xaml
  2. OptionsView.xaml

Показать модель

public class ApplicationViewModel : INotifyPropertyChanged
    {
        #region Fields

        private ICommand changePageCommand;
        private ICommand addFilesCommand;
        private IPageViewModel _currentPageViewModel;
        private List<IPageViewModel> _pageViewModels;
        #endregion

        public ApplicationViewModel()
        {
            // Add available pages
            PageViewModels.Add(new HomeViewModel() { IsSelected = true });
            PageViewModels.Add(new OptionsViewModel() { IsSelected = false });

            // Set starting page
            CurrentPageViewModel = PageViewModels[0];
        }

        #region Properties / Commands

        public ICommand ChangePageCommand
        {
            get
            {
                if (changePageCommand == null)
                {
                    changePageCommand = new RelayCommand(
                        p => ChangeViewModel((IPageViewModel)p),
                        p => p is IPageViewModel);
                }

                return changePageCommand;
            }
        }


        public List<IPageViewModel> PageViewModels
        {
            get
            {
                if (_pageViewModels == null)
                    _pageViewModels = new List<IPageViewModel>();
                return _pageViewModels;
            }
        }

        public IPageViewModel CurrentPageViewModel
        {
            get
            {
                return _currentPageViewModel;
            }
            set
            {
                if (_currentPageViewModel != value)
                {
                    _currentPageViewModel = value;
                    OnPropertyChanged("CurrentPageViewModel");
                }
            }
        }

        #endregion

        #region Methods

        private void ChangeViewModel(IPageViewModel viewModel)
        {
            if (!PageViewModels.Contains(viewModel))
                PageViewModels.Add(viewModel);
            CurrentPageViewModel = PageViewModels.FirstOrDefault(vm => vm == viewModel);
        }

        #endregion
    }

При запуске приложения

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWindow app = new MainWindow();
            ApplicationViewModel context = new ApplicationViewModel();
            app.DataContext = context;
            app.Show();
        }
    }

Windows-фон

<Window.Resources>
        <DataTemplate DataType="{x:Type home:HomeViewModel}">
            <home:HomeView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type options:OptionsViewModel}">
            <options:OptionsView />
        </DataTemplate>
    </Window.Resources>

А внутри HomeView.xaml у меня есть простые button:

<Button Command="{Binding DataContext.AddFilesCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
        CommandParameter="{Binding}"/>

И я хочу добавить простую команду Click, что-то.

Так что я пытаюсь добавить это ICommand:

public ICommand AddFilesCommand
{

}

Есть предложения, как добавить этот вид в команду, которая будет выполняться после каждого Button Click?

1 Ответ

0 голосов
/ 15 февраля 2019

Это можно сделать намного проще.Я хотел бы создать класс для простой реализации команд:

using System;
using System.Windows.Input;

namespace YourNameSpace
{
    public class RelayCommand : ICommand
    {
        private Action Action;

        public Command(Action _action)
        {
            Action = _action;
        }

        public event EventHandler CanExecuteChanged = (sender, e) => { };

        public bool CanExecute(object parameter) => true;

        public void Execute(object parameter)
        {
            Action();
        }
    }
}

Затем создайте команду (для этого вам не нужен закрытый ICommand):

public ICommand AddFileCommand { get; set; }

И используйте его так (в конструкторе):

AddFileCommand = new RelayCommand(()=> 
{
    MethodToExecute();
});

XAML:

<Button Command="{Binding AddFileCommand}"/>

Таким образом, ваш код будет легче увидеть через.

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