c# - WPF MVVM 绑定(bind)超链接 RequestNavigate 到 View 模型

标签 c# wpf xaml mvvm hyperlink

在 WPF 窗体上,我有一个超链接,当单击它时,应该会在重定向到内部网页之前聚合数据库中的一些数据。

目前 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 模型中。

我尝试做的是添加到 ViewModel 属性

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

并在 XAML 中将绑定(bind)更改为

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

但它开始给我强制转换异常。

将此机制从 View 转移到 ViewModel 的最合适方法是什么?

最佳答案

HyperLink 有点问题。它不支持命令绑定(bind)。

可以通过附加属性将对命令绑定(bind)的支持硬塞进其中,但只修改一个按钮来做同样的事情会更容易。

<Style TargetType="Button" x:Key="HyperlinkStyledButton">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <TextBlock Foreground="DodgerBlue"
                   Text="{TemplateBinding Content}"
                   TextDecorations="Underline" 
                   Cursor="Hand" />
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

然后像这样使用超链接:

<Button Command="{Binding OpenHttpLinkCommand}" Content="www.google.com" 
        Style="{StaticResource HyperlinkStyledButton}" ToolTip="Some custom tooltip"/>

假设标准 MVVM 绑定(bind)工作正常:

在 View 模型中:

public ICommand OpenHttpLinkCommand { get; }

在 ViewModel 构造函数中:

this.OpenHttpLinkCommand = new DelegateCommand(this.OnOpenHttpLinkCommand);

以及用链接打开浏览器的命令:

private void OnOpenHttpLinkCommand()
{
    try
    {
        System.Diagnostics.Process.Start("http://www.google.com/");
    }
    catch (Exception)
    {
        // TODO: Error.
    }
}

关于c# - WPF MVVM 绑定(bind)超链接 RequestNavigate 到 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864275/

相关文章:

xaml - TFS 构建 2010 : XAML: how to make double quotes within a double quotes

c# - 在 XAML 中绑定(bind) Itemscontrol 之外的属性

c# - 关于在 Visual Studio 2010 中使用带有 VB 和 C# 语言的非托管 ActiveX OCX 时的差异?

c# - 如何在 ASP.NET C# 中获取相应美元值的比特币值?

c# - 在 nuget 包中显示评论

c# - 是否可以在 VS2012 中创建一个多项目解决方案,其中某些项目已经绑定(bind)到 TFS?

c# - DataGridTemplateColumn 中的 ComboBox 不显示 SelectedItem

c# - 多次显示和隐藏带有幻灯片动画的 WPF 窗口,同时每次都一致地显示动画

c# - 如何在 C# 代码后面显示 PictureBox

c# - Windows phone 7 绑定(bind)颜色到文本框