WPF MVVM - глобальная команда с параметрами - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно открыть одно и то же окно для отображения отчетов с разных страниц при нажатии кнопки. Но (на основе страницы, на которой я его открываю) мне нужно указать, какой отчет должен отображаться, заголовок окна и т. Д. c.

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

Я знаю, как создать глобальную команду:

public static class Global_commands
{
  private static readonly RoutedUICommand _reports = new RoutedUICommand("View report", "View_report", typeof(Global_commands));

  public static RoutedUICommand View_report
  {
     get{return _reports;}
  }
}

 //in App.xaml:

public App()
{
  var view_report = new CommandBinding(Global_commands.View_report, View_Report_Executed, View_Report_CanExecute);
  CommandManager.RegisterClassCommandBinding(typeof(Window), view_report);
}

private void View_Report_Executed(object sender, ExecutedRoutedEventArgs e)
{
  //...
}

Но это не позволяет мне передать параметр, по крайней мере, я не знаю как. Поэтому я не могу сказать, какой отчет следует отображать.

Другой известный мне вариант команд:

public class Register_command : ICommand
{
   public event EventHandler CanExecuteChanged;
   private readonly Action<object> _execute;
   private readonly Predicate<object> _canExecute;

   public Register_command(Action<object> execute, Predicate<object> canExecute)
   {
         _execute = execute;
         _canExecute = canExecute;
   }

   public bool CanExecute(object parameter)
   {
      if (_canExecute == null)
           return true;
           return _canExecute(parameter);
   }

   public void Execute(object parameter)
   {
       if (_execute != null)
          _execute(parameter);
   }
}

 //in ViewModel of some window:

 public ICommand Open_report { get; set; }

 public SomeViewModel()
 {
    Open_report = new Register_command(Open_report_window, null);
 }

 //I would a method something like that - with parameters
 private void Open_report_window(object parameter)
 {
   Report_Window report_wind = new Report_Window();
   report_wind.Owner = System.Windows.Application.Current.MainWindow;

     switch (parameter)
     {
        case "1":
         report_wind.Title= "Report number 1";
         report_wind.Report_Name="Report1.rdlc";

        default:
          break;
     }
 }

В этом случае мой метод Executed позволяет мне передать параметр, но я не знаю, как передать эту команду глобально.

Кто-нибудь может показать мне правильный подход к этому?

1 Ответ

0 голосов
/ 27 мая 2020

Извините, слишком быстро при публикации. Мое решение заключалось в использовании e.Parameter . так что первый вариант - это go для меня:

    public static class Global_commands
    {
      private static readonly RoutedUICommand _reports = new RoutedUICommand("View report", "View_report", typeof(Global_commands));

      public static RoutedUICommand View_report
      {
         get{return _reports;}
      }
    }

     //in App.xaml:

    public App()
    {
      var view_report = new CommandBinding(Global_commands.View_report, View_Report_Executed, View_Report_CanExecute);
      CommandManager.RegisterClassCommandBinding(typeof(Window), view_report);
    }

    private void View_Report_Executed(object sender, ExecutedRoutedEventArgs e)
    {

      Report_Window report_wind = new Report_Window();
      report_wind.Owner = System.Windows.Application.Current.MainWindow;

       switch (e.Parameter)
         {
            case "1":
             report_wind.Title= "Report number 1";
             report_wind.Report_Name="Report1.rdlc";

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