Привязка команды WPF MVP - PullRequest
       10

Привязка команды WPF MVP

1 голос
/ 04 ноября 2011

Может быть, кто-нибудь может описать, как правильно организовать привязку команд в шаблоне mvp design?Теперь у меня есть такое решение: у меня есть класс команд:

public class Commands
{
    private static readonly RoutedUICommand OpenTaxGroupListCommand = new RoutedUICommand("OpenTaxGroupList","OpenTaxGroupList",typeof(Commands));


    public static RoutedUICommand OpenTaxGroupList
    {
        get { return OpenTaxGroupListCommand; }
    }
}

и в моем приложении презентатор:

   public ApplicationPresenter(IShell view)
        : base(view)
    {

        var openTaxGroupListBinding = new CommandBinding(Commands.OpenTaxGroupList, OpenTaxGroupList,
                                                         CanOpenTaxGroupList);

        CommandManager.RegisterClassCommandBinding(typeof(Window), openTaxGroupListBinding);
    }
    private void CanOpenTaxGroupList(object sender, CanExecuteRoutedEventArgs e)
    {

        if (_taxGroupListPresenter != null)
        {
            if (View.TabExists(_taxGroupListPresenter))
                e.CanExecute = false;
            else e.CanExecute = true;
        }
        else e.CanExecute = true;
    }
   private void OpenTaxGroupList(object sender, ExecutedRoutedEventArgs e)
    {
        DisplayTaxGroups(e.Parameter as ITaxGroupListView);
    }

Вопрос: как я могу отделить логику привязки команд от класса ApplicationPresenter?

ОБНОВЛЕНИЕ: Я нашел это решение:

  public interface ICommandProvider
{
    IEnumerable<RoutedUICommand> GetCommands();
}

В ApplicationPresenter:

 public IEnumerable<RoutedUICommand> GetCommands()
    {
        return new Collection<RoutedUICommand>
                   {
                       new OpenTaxGroupListCommand(this, View,_taxGroupListPresenter)
                   };
    }

и моей RoutedUICommand:

 public OpenTaxGroupListCommand(ApplicationPresenter presenter, IShell view, TaxGroupListPresenter taxGroupListPresenter)
    {
        _presenter = presenter;
        _view = view;
        _taxGroupListPresenter = taxGroupListPresenter;
        var openTaxGroupListBinding = new CommandBinding(Commands.OpenTaxGroupList,Execute,CanExecute);
        CommandManager.RegisterClassCommandBinding(typeof(Window), openTaxGroupListBinding);
    }
 private void CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
       e.CanExecute = true;
    }
private void Execute(object sender, ExecutedRoutedEventArgs e)
    {
        _presenter.DisplayTaxGroups(e.Parameter as ITaxGroupListView, out _taxGroupListPresenter);
    }

и xaml View:

<Resources:MenuLinkButton x:Name="btnOpenTaxGroupList" Content="Nodokļa grupas" HorizontalAlignment="Left"  
                Style="{StaticResource menuLinkButton}" ImageSource="{StaticResource taxes16Image}" Command="WtpPresenters:Commands.OpenTaxGroupList" 
                                  CommandParameter="{StaticResource  taxGroupListView}"/>

Это нормальное решение?

...