Reputation: 25367
I've got a template, containing an other template, containing following code:
<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>
But because it is inside a template, when I run the code, I'm getting an exception.
The usual way to deal with it is through using commands, e.g. something like
<Hyperlink CommandParameter="{Binding Website.Uri.AbsoluteUri}" Command="{Binding Navigate, ElementName=UserControl}">
<TextBlock Text= "{Binding Website.Uri.AbsoluteUri}" />
</Hyperlink>
I've tried:
<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>
but I'm getting following error:
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 is declared like follows:
<UserControl x:Name="userControl" ....
How do I customize DataGridHyperlinkColumn.ElementStyle
so instead of setting event handler, command would be set?
UPDATE
Command code looks like this:
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
}
Upvotes: 1
Views: 2212
Reputation: 6825
Not really the answer to your question, but maybe a workaround: to turn your Column into a template column and display a styled button within, something along the lines of:
<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>
Upvotes: 2