Ну ..... это не легко.Как Скотт говорит, что вам может быть намного проще, используя SelectionUnit и SelectionMode в .Net 4 и его элемент управления DataGrid.Но, если вы хотите сделать это так, как вы начали, попробуйте следующее:
В XAML (я не делал все это как Шаблон или Стиль, только один столбец, чтобы заставить его работать), вам нужнокод, такой как это:
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border Name="myOwnBorder" BorderBrush="Gray" BorderThickness="1,1,1,0" Margin="-6,0,-6,0">
<Grid Margin="6,0,6,0">
<TextBlock Text="{Binding}"/>
</Grid>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
... и затем в коде бихе (не хорошая практика проектирования, но для демонстрации) создайте функцию, такую как:
static bool FindBorderInListView(DependencyObject dep, ListView listView,
out Border border, out ListViewItem lvItem)
{
border = null;
lvItem = null;
DependencyObject depObj = dep;
while (depObj != listView)
{
if (border == null && depObj is Border)
{
border = depObj as Border;
if (border.Name != "myOwnBorder")
{
border = null;
}
}
else if (depObj is ListViewItem)
{
lvItem = depObj as ListViewItem;
}
depObj = VisualTreeHelper.GetParent(depObj);
}
return border != null && lvItem != null;
}
а затем вызовите его из события PreviewMouseDown вашего ListView:
private void MyList_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Border border;
ListViewItem lvItem;
if (FindBorderInListView(e.OriginalSource as DependencyObject, this.MyList,
out border, out lvItem))
{
ItemContainerGenerator generator = this.MyList.ItemContainerGenerator;
int rowIndex = generator.IndexFromContainer(lvItem);
int columnIndex = Grid.GetColumn(border);
MessageBox.Show("Cell #:" + rowIndex + columnIndex);
}
}
Кредит, причитающийся за кредит, Джош Смит выяснил, как это сделать примерно в 2007 году. Я думаю, в ответ на MSDNвопрос сообщества .
Удачи с этим!Мне тоже пришлось однажды реализовать нечто подобное в DataGrid.