【问题标题】:Is there a way to associate a Command with a WPF Toolkit DataGridHyperlinkColumn?有没有办法将命令与 WPF 工具包 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>

在运行时,我可以看到绑定正在被正确评估(命令的属性获取器被调用),但是当我单击超链接时命令没有执行。有没有更好的方法来做到这一点?

谢谢,

丹尼尔

【问题讨论】:

    标签: wpf datagrid command wpftoolkit


    【解决方案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 属性。这个问题询问了这些类型的绑定,希望能帮助您更好地理解它:stackoverflow.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 存在于您的视图模型对象上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 2020-12-14
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多