2016-02-03 3 views
0

Я новичок в WPF и особенно с командами, и теперь у меня есть задача создать RelayCommand для кнопки. Я должен узнать, что мне нужно отделить логику от пользовательского интерфейса. У меня просто есть 2 текстовых поля и текстовый блок, пользователь записывает имена в полях и нажимает кнопку, чтобы отобразить их в текстовом блоке. Моя задача - прочитать о RelayCommand и реализовать его, но я действительно не понимаю, как это работает. У меня есть метод UpdateName в моем классе Logic.cs, как его использовать в RelayCommand? Все, что у меня есть, это RelayCommand.cs с реализованным интерфейсом ICommand. Это код, который я нашел в Интернете, но я действительно не знаю, что положить туда.RelayCommand для обновления TextBox

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
private Action methodToExecute; 
private Func<bool> canExecuteEvaluator; 
public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator) 
{ 
    this.methodToExecute = methodToExecute; 
    this.canExecuteEvaluator = canExecuteEvaluator; 
} 
public RelayCommand(Action methodToExecute) 
    : this(methodToExecute, null) 
{ 
} 
public bool CanExecute(object parameter) 
{ 
    if (this.canExecuteEvaluator == null) 
    { 
     return true; 
    } 
    else 
    { 
     bool result = this.canExecuteEvaluator.Invoke(); 
     return result; 
    } 
} 
public void Execute(object parameter) 
{ 
    this.methodToExecute.Invoke(); 
} 

ответ

2

Вы не ставите никакой логики в RelayCommand.

Я полагаю, вид где Button есть, имеет свой набор DataContext к классу в Logic.cs, поэтому я полагаю, Logic.cs содержит ViewModel. Таким образом, в ViewModel добавить новое свойство:

public ICommand UpdateTextCommand { get; private set; } 

В конструкторе ViewModel в инициализации следующей команды:

UpdateTextCommand = new RelayCommand(() => this.UpdateName(), null); 

И в представлении (XAML) вы привяжите Button «s Command свойства:

<Button Content="Click me to change the TextBlock" Command="{Binding UpdateTextCommand}" /> 

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

Обновление: Конструктор - это метод без возвращаемого типа (даже не void). Всякий раз, когда вы создаете экземпляр (new) class, этот метод запускается.

Для Logic это должно быть (если имя class является Logic):

public Logic() 
{ 
    // Statements here 
} 

Для RelayCommand этого является конструктор:

public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator) 
+0

Да, DataContext установлен в класс Logic. Я добавил свойство, но где именно я инициализирую команду? Где конструктор viewmodel, в Logic.cs? Извините, я на самом деле новичок в этом. Я понимаю, что обязательная часть. – tweedledum11

+0

Обновлен ответ. –

+0

У меня получилось, я инициализировал команду в контрукторе Logic, UpdateText() вы имеете в виду мой собственный метод UpdateName? Моя Visual Studio заставила меня изменить это на следующее: UpdateTextCommand = new RelayCommand (delegate (object obj) {UpdateName();}, null); Почему это? Один раньше не работал. – tweedledum11

1

Вы должны реализовать метод, который вы хотите звонить в ваш ViewModel так же, как вы делали это с CodeBehind-File, прежде чем начать с MVVM.

Затем вам нужно создать ICommand как собственность в вашем ViewModel (для связывания впоследствии):

private RelayCommand relUpdateText; 
public ICommand CUpdateTextCommand { get { return relUpdateText; } } 

В конструкторе (вашей ViewModel), необходимо создать объект RelayCommand:

relUpdateText = new RelayCommand(OnUpdateText); 

С OnUpdateText, являющимся вашим методом, который вы хотите вызвать.

Далее вы должны создать конструктор с правильными параметрами. Если OnUpdateText выглядит следующим образом:

private void OnUpdateText(string text){...} 

Ваш RelayCommand конструктор должен выглядеть так:

private Action<String> exec; 
public RelayCommand(Action<String> exec) 
{ 
    this.exec = exec; 
} 

Как вы видите действие нужны те же параметры, что и метод его инкапсулирует. В конце концов, вы должны также проверить, если событие не равно нулю:

public void Execute(object parameter) 
{ 
    if(exec != null) exec(paramters as string); 
} 

Если у вас есть несколько параметров, вам придется использовать конвертер.

+0

Большое спасибо, что облегчает понимание! – tweedledum11

 Смежные вопросы

  • Нет связанных вопросов^_^