2016-03-08 93 views
1

在WPF窗體上,我有一個超鏈接,點擊時應該在重定向到內部網頁之前彙總數據庫中的一些數據。WPF MVVM綁定超鏈接RequestNavigate查看模型

目前XAML看起來如下:

<Hyperlink RequestNavigate="Hyperlink_RequestNavigate" IsEnabled="{Binding CanTakePayment}"> 
    Launch Payments Portal 
</Hyperlink> 

做數據庫的東西是用來Hyperlink_RequestNavigate方法,駐留在View.xaml.cs

它看起來是這樣的:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) 
{ 
    var transactionReference = GetToken(100M, "13215", "product"); 
    var url = string.Format("{0}New?transactionReference={1}", Settings.Default.PaymentUrlWebsite, transactionReference); 
    e.Handled = true; 
} 

我不像這個機制在這裏,並希望將其移動到View模型。

我試圖做的就是添加到視圖模型屬性

public ICommand NavigateToTakePayment  
{ 
    get { return _navigateToTakePayment; } 
    set { _navigateToTakePayment = value; } 
} 

和XAML變化結合

<Hyperlink RequestNavigate="{Binding Path=NavigateToTakePayment}" IsEnabled="{Binding CanTakePayment}"> 
    Launch Payments Portal 
</Hyperlink> 

,但它開始給我投的例外。

什麼是最合適的方式將此機制從視圖移動到ViewModel?

+0

使用'Command'而不是'RequestNavigate'。 RequestNavigate是一個事件處理程序,它將期望代碼落後於實現,而命令將期望綁定。 – XAMlMAX

+0

@XAMlMAX如果我使用命令,它運行良好,並打開窗口沒有錯誤,但是當我點擊鏈接沒有任何反應時,它不會跳入setter。 –

+0

你如何初始化你的'NavigateToTakePayment'命令? setter僅在初始化時使用,UI將調用'getter',因爲它需要調用Command上的Execute方法。希望這是有道理的,如果不是,我會發佈一個答案來幫助我的評論。 – XAMlMAX

回答

1

問題與您的應用程序是ICommand未使用前初始化。
我有一個命令執行,像這樣:

public class RelayCommand : ICommand 
    { 
     Predicate<object> _canExecute; 
     Action<object> _execute; 
     bool _defaultBehaviourForCanExecute; 

     public RelayCommand(Action<object> execute, bool defaultBehaviourForCanExecute = true, Predicate<object> canExecute = null) 
     { 
      _canExecute = canExecute; 
      _execute = execute; 
      _defaultBehaviourForCanExecute = defaultBehaviourForCanExecute; 
     } 

     public bool CanExecute(object parameter) 
     { 
      if (_canExecute != null) 
      { 
       Logger.LogInformation("Evaluating can execute method for " + _canExecute.Method.DeclaringType + "->"+_canExecute.Method.Name); 
       return _canExecute.Invoke(parameter); 
      } 
      return _defaultBehaviourForCanExecute; 
     } 

     public event EventHandler CanExecuteChanged; 

     public void RaiseCanExecuteChanged() 
     { 
      if (CanExecuteChanged != null) 
       CanExecuteChanged(this, new EventArgs()); 
     } 

     public void Execute(object parameter) 
     { 
      Logger.LogInformation("Executing command method for " + _execute.Method.DeclaringType + "->" + _execute.Method.Name); 
      _execute.Invoke(parameter); 
      RaiseCanExecuteChanged(); 
     } 
    } 

現在,這是我的ViewModel初始化像這樣:

NavigateToTakePayment = new RelayCommand(navigateToTakePayment CommandMethod);//it also can take canExecute method if you need a condition before executing. 

然後在XAML中使用這樣的:

<Hyperlink RequestNavigate="{Binding Path=NavigateToTakePayment}" IsEnabled="{Binding CanTakePayment}"> 
    Launch Payments Portal 
</Hyperlink> 

BTW:當你需要禁用超鏈接時,實現一個canexecute方法
然後它會自動完成。如果您需要更多信息,我會更新我的答案。
快樂編碼

+0

謝謝@XAMIMAX這樣做,感謝幫助。 –

+0

@MatasVaitkevicius沒問題,樂意幫忙:-) – XAMlMAX