有没有办法将命令与 WPF 工具包 DataGridHyperlinkColumn 相关联?
Posted
技术标签:
【中文标题】有没有办法将命令与 WPF 工具包 DataGridHyperlinkColumn 相关联?【英文标题】:Is there a way to associate a Command with a WPF Toolkit DataGridHyperlinkColumn? 【发布时间】:2011-02-08 21:35:09 【问题描述】:有什么方法可以将命令与 DataGridHyperlinkColumn 关联起来?我试过这个:
<DataGridHyperlinkColumn Header="Client Name" Binding="Binding ShortName">
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Hyperlink.Command"
Value="Binding DataContext.NavigateToClientCommand, RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type local:ClientsSummaryView"/>
<Setter Property="Hyperlink.CommandParameter" Value="Binding"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
在运行时,我可以看到绑定正在被正确评估(命令的属性获取器被调用),但是当我单击超链接时命令没有执行。有没有更好的方法来做到这一点?
谢谢,
丹尼尔
【问题讨论】:
【参考方案1】:您确定该命令与超链接相关联吗?我尝试在示例应用程序中进行设置,但该命令未与超链接关联(如果您从 CanExecute
返回 false,您将能够快速确定它是否已连接)。
相反,我创建了一个DataGridTemplateColumn
来完成此操作:
<DataGridTemplateColumn Header="Client Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Command="Binding DataContext.NavigateToClientCommand, RelativeSource=RelativeSource AncestorType=x:Type local:ClientsSummaryView"
CommandParameter="Binding ShortName">
<TextBlock Text="Binding ShortName" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果您必须创建多个列,这将变得非常烦人。用 Reflector 破解打开 Toolkit 后,看起来它支持 TargetName
/ NavigationUrl
范式使用超链接。
如果您在很多地方都需要这种类型的列,我建议您扩展 DataGridHyperlinkColumn
并添加一个 Command 属性。然后,您可以修改从 GenerateElement
返回的元素,以便它使用您的命令。
【讨论】:
安倍:谢谢。我希望绕过 DataGridTemplateColumn,但老实说,它看起来并不比我所拥有的差多少。再次感谢! 您能解释一下<Hyperlink Command="Binding...">
的工作原理吗?看起来很复杂。
@Dai - 这是一个RelativeSource
绑定到添加此列的ClientsSummaryView
的DataContext
上的ICommand
属性。这个问题询问了这些类型的绑定,希望能帮助您更好地理解它:***.com/questions/84278/…【参考方案2】:
是的,但不是标准的DataGridHyperlinkColumn
。您需要稍微增强该类。
public class DataGridHyperlinkColumn : System.Windows.Controls.DataGridHyperlinkColumn
/// <summary>
/// Support binding the hyperlink to an ICommand rather than a Uri
/// </summary>
public BindingBase CommandBinding get; set;
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
var result = base.GenerateElement(cell, dataItem);
if (((TextBlock)result).Inlines.FirstInline is Hyperlink link)
BindingOperations.SetBinding(link, Hyperlink.CommandProperty, CommandBinding);
return result;
设置正确的命名空间映射后,您可以这样做:
<c:DataGridHyperlinkColumn Header="Booking" Binding="Binding Path=ReservationNo" CommandBinding="Binding Path=NavigateCommand" />
这假定 NavigateCommand
存在于您的视图模型对象上。
【讨论】:
以上是关于有没有办法将命令与 WPF 工具包 DataGridHyperlinkColumn 相关联?的主要内容,如果未能解决你的问题,请参考以下文章