我有一个ListView。当我选择一行时,我希望只选择一个单元格而不是整行。我怎么能得到这个? 这是我的样式和模板。
<ListView x:Name="List"
ItemsSource="{Binding }"
ItemContainerStyle="{DynamicResource ListItemStyle}">
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn HeaderContainerStyle="{StaticResource myHeaderStyle}"
Header="1"
CellTemplate="{StaticResource myCellTemplate1}">
</GridViewColumn>
<GridViewColumn Header="2"
HeaderContainerStyle="{StaticResource myHeaderStyle}"
HeaderTemplate="{StaticResource myHeaderTemplate}"
CellTemplate="{StaticResource cellTemplate2}">
</GridViewColumn>
<GridViewColumn Header="3"
HeaderContainerStyle="{StaticResource myHeaderStyle}"
HeaderTemplate="{StaticResource myHeaderTemplate}"
CellTemplate="{StaticResource cellTemplate3}" />
<GridViewColumn Header="4"
HeaderContainerStyle="{StaticResource myHeaderStyle}"
HeaderTemplate="{StaticResource myHeaderTemplate}"
CellTemplate="{StaticResource cellTemplate4}"/>
</GridView>
</ListView.View>
</ListView>
<Style x:Key="ListItemStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}" >
<Grid SnapsToDevicePixels="True" Margin="0" Width="410" x:Name="GridSmall">
<Border x:Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="0" />
<GridViewRowPresenter x:Name="Rows" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Background" Value="Black"/>
<Setter Property="Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="myCellTemplate1">
<DataTemplate.Resources>
<local:NullIdConverter x:Key="NullIdConverterKey"/>
</DataTemplate.Resources>
<DockPanel x:Name="RR">
<TextBlock FontSize="18" x:Name="TxtBl"
HorizontalAlignment="Center"
Text="{Binding Path = Id}"/>
</DockPanel>
</DataTemplate>
感谢。
答案 0 :(得分:0)
如果您使用的是.NET 3.5 SP1或.NET 4,我建议您查看DataGrid而不是ListView。
我认为它为您提供了更多的数据灵活性,并且有一个名为SelectionUnit的属性,您可以将其设置为“Cell”,为您提供所需的功能。
不幸的是,我不认为有一种简单的方法可以对ListView做同样的事情。
答案 1 :(得分:0)
嗯.....这不容易。就像Scott说的那样,使用.Net 4中的SelectionUnit和SelectionMode及其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>
...然后在代码behing(不是很好的设计实践,但为了演示)创建一个函数,如:
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;
}
然后从ListView的PreviewMouseDown事件中调用它:
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 community question。
祝你好运!我也必须在DataGrid中实现类似的东西。