WPF, C # и MVVM Выставляющие команды - PullRequest
0 голосов
/ 04 мая 2011

Привет всем, я пытаюсь справиться с использованием MVVM, но мне трудно :(, во-первых, для моего вопроса, я использую код, предоставленный в этой статье MVVM в качестве шаблона для моего обучения. Мой вопрос прост: как выставить независимые команды, в этом случае он создал список гиперссылок, но как мне создать единственную фиксированную кнопку, которая выполняет те же действия, что и ссылка «создать нового клиента»?Я создал что-то вроде этого (был добавлен в MainWindowViewModel.cs):

   public CommandViewModel exposedCommand
    {
        get
        {
             return new CommandViewModel(
              Strings.MainWindowViewModel_Command_CreateNewCustomer,
              new RelayCommand(param => this.CreateNewCustomer())
              );
        }
    }

, а затем в документе xaml я создал новую кнопку, это было добавлено в MainWindow.xaml

* 1007.*

Я не уверен, что что-то упустил, или что я не так делаю, так что, если я звучу немного наивно, я только начал использовать MVVM и маршрутизируемые команды и т. Д. О, другая вещь, которая действительно загружаетссылка просто не создает вкладку, другими словами, если вы добавите

Console.Writeline("HERE"); 

в метод visibleCommand. Он выведет «ЗДЕСЬ», он просто ничего не сделает, когда вынажмите на кнопку.Спасибо любая помощь будет так ценится.

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Ваш код XAML правильный. Я также начал со статьи Джоша Смита о MVVM. Ниже приведен упрощенный пример того, как я реализую Команды в моих ViewModels:

public class ProjectViewModel : ViewModelBase
{
    // Private variable for holding save command
    private RelayCommand _saveCommand;

    // Other fields here

    // Constructors and properties and stuff here

    // Command Property for Save button. Bind XAML to "SaveCommand"
    public ICommand SaveCommand
    {
        get
        {
            if (_saveCommand == null) // Init command on first get
                _saveCommand = new RelayCommand(param => this.SaveChanges(), param => this.CanSave);

            return _saveCommand;
        }
    }

    /// <summary>
    /// Method called when save command is executed
    /// </summary>
    private void SaveChanges()
    {
        // Save logic here...
    }

    /// <summary>
    /// Predicate for determining if SaveCommand is enabled
    /// </summary>        
    private bool CanSave
    {
        get
        {
            return true; // Replace with SaveCommand predicate logic
        }
    }
}

Если это все еще не работает, проверьте выходные данные времени выполнения для BindingErrors. Если существует ошибка BindingError, которая подразумевает, что представление не может найти команду SaveCommand, тогда ваша модель представления неправильно установлена ​​как DataContext представления. Дайте мне знать в комментариях, если это проблема.

0 голосов
/ 04 мая 2011

Первое, что меня беспокоит, - это ваш код в получателе вашей собственности.Вы возвращаете новый объект КАЖДЫЙ ВРЕМЯ Доступ к незащищенной команде.На самом деле это не рекомендуется, вы должны хранить это в вспомогательном свойстве, например, так:

CommandViewModel _exposedCommand;
public CommandViewModel exposedCommand
{
  get
  {
     if (_exposedCommand == null)
     {
       _exposedCommand = new CommandViewModel(
       Strings.MainWindowViewModel_Command_CreateNewCustomer,
       new RelayCommand(param => this.CreateNewCustomer()));
     }
     return _exposedCommand;
  }
}

То есть типичный способ представить желаемое свойство ICommand выглядит примерно так:

RelayCommand _exposedCommand;
public ICommand exposedCommand
{
    get
    {
        if (_exposedCommand == null)
            _exposedCommand= new RelayCommand(param => this.CreateNewCustomer());
        return _exposedCommand;
    }
}
0 голосов
/ 04 мая 2011

Вы можете связать команду только с теми объектами, которые имеют реализацию интерфейса ICommand.

В вашем примере вы связываетесь с объектом модели представления.

Вместо этого создайте свойство в модели представления, которое является типом RelayCommand, и свяжите это с кнопкой.

Это должно работать.

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