【问题标题】:How to set hyperlink command from inside template?如何从模板内部设置超链接命令?
【发布时间】:2012-06-25 17:05:59
【问题描述】:

我有一个模板,包含另一个模板,包含以下代码:

<DataGridHyperlinkColumn Header="Website" Binding="{Binding Website}" 
    IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
<DataGridHyperlinkColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick" />
        <Setter Property="Tag" Value="{Binding Website}"/>
    </Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

但是因为它在模板中,所以当我运行代码时,我会遇到异常。

通常的处理方法是使用命令,例如像

<Hyperlink CommandParameter="{Binding Website.Uri.AbsoluteUri}" Command="{Binding Navigate, ElementName=UserControl}">
<TextBlock Text= "{Binding Website.Uri.AbsoluteUri}" />
</Hyperlink>

我试过了:

<DataGridHyperlinkColumn Header="Website" Binding="{Binding Website}" 
        IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
    <DataGridHyperlinkColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Hyperlink.Command" Value="{Binding Navigate, ElementName=userControl}"/>
            <Setter Property="Hyperlink.CommandParameter" Value="{Binding Website}"/>               
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

但我收到以下错误:

Cannot find source for binding with reference 'ElementName=userControl'. 
BindingExpression:Path=Navigate; DataItem=null; target element is 'TextBlock' 
(Name=''); target property is 'Command' (type 'ICommand')

UserControl 声明如下:

<UserControl x:Name="userControl" ....

如何自定义DataGridHyperlinkColumn.ElementStyle 以便设置命令而不是设置事件处理程序?

更新

命令代码如下所示:

    public class NavigateCommand : ICommand
    {
        #region ICommand Members

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            Process.Start(parameter.ToString());
        }

        #endregion
    }

【问题讨论】:

  • 你试过{Binding Navigate, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}而不是ElementName绑定吗?
  • 我试过了,错误信息消失了,我得到了Navigate命中,但是,命令的CanExecuteExecute仍然没有命中
  • 你使用RelayCommand实现吗?
  • @LPL 我已经实现了 ICommand,但没有使用 NavigateCommand 类中实现的其他方法
  • 同样的问题here

标签: c# wpf xaml


【解决方案1】:

不是您问题的真正答案,但可能是一种解决方法:将您的 Column 变成模板列并在其中显示一个样式按钮,类似于:

<DataGridTemplateColumn Header="Website" 
        IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
           <Button Content="{Binding Website}" Command="{StaticResource NavigateCommand}" CommandParameter="{Binding Website}" Style={StaticResource LinkStyle}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

  • 是的,这行得通,但我仍然想知道以我的方式写下命令有什么问题
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多