2016-02-03 35 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