Мне нужно открыть одно и то же окно для отображения отчетов с разных страниц при нажатии кнопки. Но (на основе страницы, на которой я его открываю) мне нужно указать, какой отчет должен отображаться, заголовок окна и т. Д. 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 позволяет мне передать параметр, но я не знаю, как передать эту команду глобально.
Кто-нибудь может показать мне правильный подход к этому?