2012-06-23 2 views
1

У меня есть шаблон, содержащий другой шаблон, содержащий следующий код:Как установить команду гиперссылки из внутреннего шаблона?

<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 
    } 
+2

Вы пробовали '{Binding Navigate, RelativeSource = {RelativeSource AncestorType = {x: Тип UserC ontrol}}} 'вместо привязки ElementName? – LPL

+0

Я пробовал это, и сообщение об ошибке исчезло, и я получаю «Навигация», но, тем не менее, команда «CanExecute» и «Execute» никогда не попадают –

+0

Используете ли вы [RelayCommand] (http: // msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) реализация? – LPL

ответ

2

Не совсем ответ на ваш вопрос, но, возможно, обходной путь: чтобы превратить ваш столбец в столбец шаблона и отобразить стилизованную кнопку внутри, что-то вроде:

<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> 
+0

да, это работает, но мне все же хотелось бы знать, что случилось с написанием команд так, как я сделал –