在WPF Datagrid中突出显示所选项目

时间:2019-02-14 14:10:05

标签: c# wpf

我的问题似乎很简单,但是无论如何我尝试的所有操作都无法达到预期效果。

在我的MainWindow中,我有一个ContentControl绑定到一个名为“ CurrentView”的变量,其中一个是ViewModel。我通过导航栏切换CurrentView。 在我的第一个视图中,有一个DataGrid。当我单击该DataGrid上的元素时,该行将以蓝色突出显示,并且选定的项将保存在我的ViewModel中。

当我现在跳到一个新的视图并返回到第一个视图时,仍然在DataGrid中选择了选定的项,但未突出显示行…

我尝试了很多事情,但以某种方式无法使行突出显示。

有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

您需要将DataGrid放在焦点上,以使所选行在默认情况下突出显示。例如,您可以在Focus()事件处理程序中为要导航到的视图调用DataGrid的{​​{1}}方法:

Loaded

答案 1 :(得分:1)

AFAIK,您需要专注于特定行。 我使用这种行为:

使用System.Windows;    使用System.Windows.Controls;    使用System.Windows.Input;    使用System.Windows.Interactivity;

namespace blaa
{
class DataGridRowBehavior : Behavior<DataGridRow>
{
    public static bool GetIsDataGridRowFocussedWhenSelected(DataGridRow dataGridRow)
    {
        return (bool)dataGridRow.GetValue(IsDataGridRowFocussedWhenSelectedProperty);
    }

    public static void SetIsDataGridRowFocussedWhenSelected(
      DataGridRow dataGridRow, bool value)
    {
        dataGridRow.SetValue(IsDataGridRowFocussedWhenSelectedProperty, value);
    }

    public static readonly DependencyProperty IsDataGridRowFocussedWhenSelectedProperty =
        DependencyProperty.RegisterAttached(
        "IsDataGridRowFocussedWhenSelected",
        typeof(bool),
        typeof(DataGridRowBehavior),
        new UIPropertyMetadata(false, OnIsDataGridRowFocussedWhenSelectedChanged));

    static void OnIsDataGridRowFocussedWhenSelectedChanged(
      DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        DataGridRow item = depObj as DataGridRow;
        if (item == null)
            return;

        if (e.NewValue is bool == false)
            return;

        if ((bool)e.NewValue)
            item.Selected += OndataGridRowSelected;
        else
            item.Selected -= OndataGridRowSelected;
    }
    static void OndataGridRowSelected(object sender, RoutedEventArgs e)
    {
        DataGridRow row = e.OriginalSource as DataGridRow;
        // If focus is already on a cell then don't focus back out of it
        if (!(Keyboard.FocusedElement is DataGridCell) && row != null)
        {
            row.Focusable = true;
            Keyboard.Focus(row);
        }
    }

  }
}

用法:

        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="local:DataGridRowBehavior.IsDataGridRowFocussedWhenSelected" Value="true"/>
            </Style>
        </DataGrid.RowStyle>