2016-02-03 31 views
0

我是新来的WPF,特别是命令,我现在有任务来为按钮构建一个RelayCommand。我应该知道我需要从UI中分离逻辑。我只有2个文本框和一个textBlock,用户在框中写入名称,然后单击按钮将其显示在文本块中。我的任务是阅读有关RelayCommand并实施它,但我真的不明白它是如何工作的。我在我的Logic.cs类中有一个UpdateName方法,如何在RelayCommand中使用它?我所拥有的是具有实现的ICommand接口的RelayCommand.cs。 这是我在网上找到的代码,但我真的不知道要放在哪里。用于更新文本框的RelayCommand

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包含视图模型。因此,在视图模型添加一个新的属性:

public ICommand UpdateTextCommand { get; private set; } 

在视图模型的构造函数初始化命令:

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

而且在你绑定ButtonCommand属性视图(XAML):

<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.cs中的视图模型的构造器在哪里?对不起,我真的很新鲜。绑定部分我明白。 – tweedledum11

+0

更新了答案。 –

+0

好吧,我在Logic构造函数中初始化了命令,通过UpdateText()来表示我的自定义方法UpdateName是否正确?我的Visual Studio让我改变它为:UpdateTextCommand = new RelayCommand(delegate(object obj){UpdateName();},null);这是为什么?之前的一个没有工作。 – tweedledum11

1

你需要实现你的方法,你要拨打的您的ViewModel就像您在开始使用MVVM之前使用CodeBehind-File所做的一样。

然后,你需要创建一个ICommand在你的ViewModel属性(后绑定):

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

在你的构造函数(你的视图模型),你需要创建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