Как переместить выбранную строку в видимую область в DataGrid? (MVVM) - PullRequest
0 голосов
/ 19 мая 2019

Это моя ситуация.

У меня есть DataGrid со многими элементами.

    <DataGrid Grid.Row="2"

            ItemsSource="{Binding Dati, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
            SelectedItem="{Binding SelectRowGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
            Style="{DynamicResource ST_DataGrid}" 
            CellStyle="{DynamicResource St_DataGridCellStyle}" SelectionMode="Single"
            Grid.Column="1" Grid.RowSpan="2">

   <DataGrid.Columns>

После успешного поиска я хочу перейти к строке в DataGrid.

Как я могу это сделать?Спасибо большое.

это свойство SelectRowGrid

Public Property Dati As ObservableCollection(Of Model_Database)

Private _SelectRowGrid As Model_Database
Public Property SelectRowGrid As Model_Database
    Get
        Return _SelectRowGrid
    End Get
    Set(value As Model_Database)
        _SelectRowGrid = value
        OnPropertyChanged("SelectRowGrid")
    End Set
End Property

это поисковый код

    Private _TxtSearch As String
    Public Property TxtSearch As String
    Get
        Return _TxtSearch
    End Get
    Set(value As String)
        _TxtSearch = value
        OnPropertyChanged("TxtSearch")

        SelectRowGrid = (From n In Me.Dati Where n.c_amb.ToUpper().Trim Like _TxtSearch.ToUpper().Trim() + "*" Select n).FirstOrDefault()

       'Now I want position on the Datagrid row 

    End Set
End Property

Другими словами, мне нужно это, переместить фокус на строку, равную Мэри в сетке данных. см. Фото. Большое спасибо

enter image description here

enter image description here

1 Ответ

0 голосов
/ 19 мая 2019

Я использую 2 куска кода для этого.C #, но вы должны быть в состоянии запустить его через онлайн-конвертер.Один отображает выбранную строку, а другой фокусирует ее.

Я забыл, откуда именно они произошли - я уже давно их использую.

    class ScrollDataGridRowIntoView : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {

            base.OnAttached();
            this.AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
        }
        void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is DataGrid)
            {
                DataGrid datagrid = (sender as DataGrid);
                if (datagrid.SelectedItem != null)
                {
                    datagrid.Dispatcher.BeginInvoke((Action)(() =>
                    {
                        datagrid.UpdateLayout();
                        if (datagrid.SelectedItem != null)
                        {
                            datagrid.ScrollIntoView(datagrid.SelectedItem);
                        }
                    }));
                }
            }
        }
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
        }
    }

и

    class DataGridRowFocusBehavior : 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(DataGridRowFocusBehavior),
            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);
            }
        }
    }

В моей таблице данных:

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

xmlns для i:

         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
...