Вот еще неплохой вариант. Создать оболочку над элементами списка. Сделать так, чтобы каждый элемент списка с данными удовлетворял интерфейсу
public interface ICommandElement
{
ICommand ClickCommand { get; }
}
Например:
public delegate void ItemClickHandler(object item);
public class CommandedItem: ICommandElement
{
private ItemClickHandler _handler;
private ICommand _command;
private void DoClick()
{
if (_handler != null) _handler(this);
}
public CommandedItem(object item, ItemClickHandler handler)
{
...
_handler = handler;
_command = new RelayCommand(x => DoClick(), x => true);
}
public ICommand ClickCommand { get { return _command; } }
}
Идея RelayCommand
взята отсюда. В таком случае код разметки преобразится в следующее:
<ItemsControl ItemsSource="{Binding Path=Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Ellipse Width="3" Height="3" Fill="Black"/>
<TextBlock Margin="4">
<Hyperlink Command="{Binding ClickCommand}">
<TextBlock Text="Тут мог бы быть Ваш байндинг на объект данных!"/>
</Hyperlink>
</TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>