我有一个 DataGrid 绑定到WPF应用程序中的 DataTable 。 DataGrid的 SelectionUnit 必须设置为Cell,但我还想为整行添加一个微妙的突出显示,以便在宽DataGrids上,当用户滚动选定的单元格时,它们可以仍然会看到该行突出显示。
这有点问题,因为DataGridRow的IsSelected属性永远不会设置为true,因为未选中Row,Cell是。
我不介意它是粘性RowSelector中的小箭头或应用于整行的突出显示。只需要某种方式突出显示选择哪一行。
答案 0 :(得分:3)
我在这里玩过一点,没什么了不起但是工作版本:
<Style TargetType="DataGridCell">
<EventSetter Event="Selected" Handler="EventSetter_OnHandlerSelected"/>
<EventSetter Event="LostFocus" Handler="EventSetter_OnHandlerLostFocus"/>
</Style>
这是代码隐藏:
private void EventSetter_OnHandlerSelected(object sender, RoutedEventArgs e)
{
DataGridRow dgr = FindParent<DataGridRow>(sender as DataGridCell);
dgr.Background = new SolidColorBrush(Colors.Red);
}
private void EventSetter_OnHandlerLostFocus(object sender, RoutedEventArgs e)
{
DataGridRow dgr = FindParent<DataGridRow>(sender as DataGridCell);
dgr.Background = new SolidColorBrush(Colors.White);
}
这是获取父母的辅助方法:
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
它不是MVVM,但考虑到我们只是使用View元素..我想这次不是必须的。 所以基本上,在第一次选择时,你会对行进行着色,然后在失去的焦点上返回到前一个的白色并更改新选择的颜色。
答案 1 :(得分:1)
这有效,并且像MVVM一样。为了更好的可读性,我使用ExpressionConverter这是一种令人惊讶的方式,使XAML更具可读性,但更容易出错。我还对它进行了一些更改以支持mutlibindings,但是这是offtopic,你从代码中得到了基本的想法:从行和网格的CurrentCell属性中获取数据上下文并比较它们是否相同
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{amazing:ExpressionConverter 'x[0] == x[1]'}">
<Binding RelativeSource="{RelativeSource Self}" Path="DataContext"></Binding>
<Binding ElementName="Grid" Path="CurrentCell" Converter="{amazing:ExpressionConverter 'x.Item'}"></Binding>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
答案 2 :(得分:0)
我在MSDN上找到了一个很好的解决方案。链接到我对类似问题的回答: