WPF MVVM绑定超链接RequestNavigate查看模型

问题描述:

在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

问题与您的应用程序是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