2016-02-09 2 views
0

У меня есть WPF Datagrid с 3 столбцами как часть окна. Элемент ItemsSource устанавливается из массива объектов платежа (grdPayments.ItemsSource = payments). Когда фокус установлен на сетку в коде позади, я хочу, чтобы третья ячейка в первой строке получала фокус.Невозможно выбрать первую строку в WPF DataGrid

Независимо от того, какой из следующих методов я использую, вторая строка выбирается и фокусируется, а не 1-я.

Это устанавливает фокус на 3-й ячейки во 2-й строке:

grdPayments.Focus(); 
grdPayments.CurrentCell = new DataGridCellInfo(grdPayments.Items[0],grdPayments.Columns[2]); 
grdPayments.SelectedCells.Add(dataGridCellInfo); 
cell.Focus(); 
grdPayments.BeginEdit(); 

Это устанавливает фокус на 2-й ряд:

grdPayments.Focus(); 
grdPayments.SelectedIndex = 0; 
grdPayments.BeginEdit(); 

Может кто-нибудь сказать мне, что происходит? DataGrid XAML приведен ниже. мой: NumberEntry это пользовательский элемент управления:

<DataGrid Name="grdPayments" 
      AutoGenerateColumns="False" 
      Background="#FF21B721" 
      ItemsSource="{Binding}" 
      SelectionUnit="Cell" 
      SelectionMode="Single" 
      Margin="5" 
      VirtualizingPanel.IsVirtualizing="False"> 
     <DataGrid.Resources> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="Background" Value="#FF21B721"/> 
      </Style> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="240" 
           Binding="{Binding Path=Description}" 
           Header="Description" 
           IsReadOnly="True" 
           TextBlock.TextAlignment="Center"> 
       <DataGridTextColumn.CellStyle> 
        <Style TargetType="DataGridCell"> 
         <Setter Property="Background" Value="{StaticResource clBr}"/> 
        </Style> 
       </DataGridTextColumn.CellStyle> 
      </DataGridTextColumn> 
      <DataGridTemplateColumn Width="100" Header="Due"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Width="100" Text="{Binding Path=Due, Converter={StaticResource CurrencyPadder}, ConverterParameter=10}" Background="{StaticResource clBr}" Focusable="False"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Width="100" Header="Paid"> 
       <DataGridTemplateColumn.CellStyle> 
        <Style TargetType="DataGridCell"> 
         <Setter Property="Background" Value="{StaticResource clBr}"/> 
        </Style> 
       </DataGridTemplateColumn.CellStyle> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <my:NumberEntry Decimals="2" 
             LostFocus="NumberEditor_LostFocus" 

           PreviewKeyDown="NumberEditor_PreviewKeyDown" 
             MaxLength="10" 
             TextAlignment="Right" 
             Text="{Binding Path=Paid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 

+0

Чтобы быть ясным, я хочу выбрать одну ячейку в первой строке, но мне удастся выбрать только всю вторую строку или ячейку во второй строке. Я пробовал все решения, которые я смог найти в Интернете безрезультатно. Должен быть способ! –

+0

ОК. С SelectionUnit = Fullrow и SelectionMode = Extended выбрана первая строка. Мне еще нужно сделать еще две вещи: 1) Выберите одну ячейку. 2) Поместите эту ячейку в режим редактирования программно. Досадно, что версия DataGrid WPF делает такую ​​явно необходимую функцию настолько сложной. –

ответ

0

Я 99% уверен, что вам нужно удалить:

SelectionUnit="Cell" 
+0

Вы должны только опубликовать ответ, если вы на 100% уверены, иначе просто опубликуйте комментарий :) –

+0

За исключением этой ячейки, которую я действительно хочу выбрать. –

0

Чтобы получить доступ к ряду с SelectionUnit набором для Cell вы должны do:

grdPayments.SelectedItem = grdPayments.SelectedCells[0].item; 

Он работает только в том случае, если вы можете выбрать только одну ячейку (не в Exten дед).

+0

К сожалению, когда я это сделал, сетка была выбрана, но ни строки, ни ячейки не было. –

0

Создание WPF DataGrid ведет себя так, как будто я хочу, чтобы это выглядело как потерянное дело: оно просто не предназначалось для того, чтобы вести себя в соответствии с моими потребностями.

Вместо этого я должен был динамически строить сетку ячеек в коде позади. Каждая ячейка в строке может быть тщательно разработана, чтобы делать все, что я хочу.

Вот мой окончательный и успешный, код:

 Binding bind = null; 
     for (int r = 1; r <= rows; r++) 
     { 
      bind = new Binding("Description"); 
      bind.Source = payments[r - 1]; 
      TextBlock col = new TextBlock(); 
      BindingOperations.SetBinding(col, TextBlock.TextProperty, bind); 
      col.TextAlignment = TextAlignment.Left; 
      col.VerticalAlignment = VerticalAlignment.Center; 
      col.Width = 240; 
      bdr = new Border(); 
      bdr.BorderBrush = System.Windows.Media.Brushes.Black; 
      bdr.BorderThickness = new Thickness(2); 
      Grid.SetColumn(bdr, 0); 
      Grid.SetRow(bdr, r); 
      bdr.Child = col; 
      grdPayments.Children.Add(bdr); 

      bind = new Binding("Due"); 
      bind.Source = payments[r - 1]; 
      bind.Converter = new MbcsCentral.CurrencyPaddingConverter(); 
      bind.ConverterParameter = "10"; 
      col = new TextBlock(); 
      BindingOperations.SetBinding(col, TextBlock.TextProperty, bind); 
      col.TextAlignment = TextAlignment.Right; 
      col.VerticalAlignment = VerticalAlignment.Center; 
      col.HorizontalAlignment = HorizontalAlignment.Left; 
      col.Width = 100; 
      bdr = new Border(); 
      bdr.BorderBrush = System.Windows.Media.Brushes.Black; 
      bdr.BorderThickness = new Thickness(2); 
      Grid.SetColumn(bdr, 1); 
      Grid.SetRow(bdr, r); 
      bdr.Child = col; 
      grdPayments.Children.Add(bdr); 


      NumberEntry vi = new NumberEntry(); 
      bind = new Binding("Paid"); 
      bind.Source = payments[r - 1]; 
      bind.StringFormat = "######0.00"; 
      BindingOperations.SetBinding(vi, NumberEntry.TextProperty, bind); 
      vi.MaxLength = 10; 
      vi.Decimals = 2; 
      vi.Width = 100; 
      vi.LostFocus += NumberEditor_LostFocus; 
      vi.PreviewKeyDown += PaidBlock_PreviewKeyDown; 
      bdr = new Border(); 
      bdr.BorderBrush = System.Windows.Media.Brushes.Black; 
      bdr.BorderThickness = new Thickness(2); 
      Grid.SetColumn(bdr, 2); 
      Grid.SetRow(bdr, r); 
      bdr.Child = vi; 
      grdPayments.Children.Add(bdr); 
     } 

grdPayments теперь пустая сетка в XAML: держатель места. Каждая ячейка сделана из UiElement, завернутого в Border, привязанного к данным и установленного в правильную строку/столбец в Grid.

Я не знаю, сделаю ли это так для большего количества столбцов, чем это необходимо здесь, но это простое и чрезвычайно эффективное решение для того, чтобы иметь возможность сосредоточиться просто в коде позади любой ячейки и войти в режим редактирования без необходимости кликов.

Не декларативный, как пурист WPF, возможно, предпочтет, но я очень рано узнал о своей карьере программирования, что в конечном итоге важно, что это работает.

Смежные вопросы