【发布时间】: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命中,但是,命令的CanExecute和Execute仍然没有命中 -
你使用RelayCommand实现吗?
-
@LPL 我已经实现了 ICommand,但没有使用 NavigateCommand 类中实现的其他方法
-
同样的问题here。