У меня есть шаблон, содержащий другой шаблон, содержащий следующий код:Как установить команду гиперссылки из внутреннего шаблона?
<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
s o вместо установки обработчика событий команда будет установлена?
UPDATE
Код команды выглядит следующим образом:
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: Тип UserC ontrol}}} 'вместо привязки ElementName? – LPL
Я пробовал это, и сообщение об ошибке исчезло, и я получаю «Навигация», но, тем не менее, команда «CanExecute» и «Execute» никогда не попадают –
Используете ли вы [RelayCommand] (http: // msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) реализация? – LPL