作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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/
我是一名优秀的程序员,十分优秀!