有没有办法将命令与 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,但老实说,它看起来并不比我所拥有的差多少。再次感谢! 您能解释一下&lt;Hyperlink Command="Binding..."&gt; 的工作原理吗?看起来很复杂。 @Dai - 这是一个RelativeSource 绑定到添加此列的ClientsSummaryViewDataContext 上的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 相关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止VS WPF设计器在工具箱中的每个对象上放置边距

如何在 WPF 中获取工具窗口标题栏高度?

c# winform 报表打印

有没有办法强制显示工具提示?

调试 WPF:工具和技术

VS2017 WPF XAML 界面卡顿,背景异常?