DataGrid CellTemplate TabNavigation

时间:2013-09-09 16:36:26

标签: c# silverlight xaml datagrid

我认为之前已经问过这个问题,但是我找不到它,所以请告诉我这是否与其他措辞有关。

问题在于SL4 DataGrid包含多个CellTemplate,包括CheckboxButton等。默认情况下,它只会在第一行标记这些元素。如果我设置TabNavigation="Cycle"它将标记所有元素,但它不会移动到下一个元素,而只是通过相同的DataGrid重新迭代Tab键。

如果我将其设置为Once,那么它将只会标记第一行....并且SL4似乎没有Continue选项可以移动到下一个对象上到达边缘。

我正在寻找一种简单的方法来取相当于TabNavigation="Cycle",除非它到达DataGrid中的最后一个可标签元素然后它移动到树中的下一个东西而不是仅仅再次标记回DataGrid中的第一个元素。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

在Silverlight中似乎没有以原生方式执行此操作,以下是数据网格控件中支持的键击的列表:http://msdn.microsoft.com/en-us/library/cc838112(v=vs.95).aspx

我可以通过使用KeyDown事件并检查Tab然后手动设置编辑单元来伪造它:

<Grid x:Name="LayoutRoot"  >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Text="Some text" />
    <sdk:DataGrid Grid.Row="1" ItemsSource="{Binding People}" AutoGenerateColumns="False" KeyDown="DataGrid_KeyDown">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding FirstName}" />
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellEditingTemplate>
            </sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding LastName}" />
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellEditingTemplate>
            </sdk:DataGridTemplateColumn>
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>
    <TextBox Grid.Row="2" Text="Some more text" />
</Grid>

    private void DataGrid_KeyDown(object sender, KeyEventArgs e)
    {
        DataGrid dg = (DataGrid)sender;
        ObservableCollection<Person> items = dg.ItemsSource as ObservableCollection<Person>;
        if (e.Key == Key.Tab && dg.SelectedIndex < items.Count -1)
        {
            dg.SelectedIndex++;
            dg.CurrentColumn = dg.Columns[0];
            dg.BeginEdit();
            var cell = dg.CurrentColumn.GetCellContent(dg.SelectedItem);
        }
    }

答案 1 :(得分:0)

我的SL4很长一段时间了。我会试试你的问题:

查看您设置的属性以获得所需的行为将无法正常工作。它只是Microsoft的方式,因此可以选择编写自己的代码来实现所需的行为。

我的想法是将以下事件附加到每个数据网格单元格:

private void DataGridCell_KeyDown(object sender, KeyEventArgs e)
 {

   if (keypressed == 'TAB' && last cell of the datagrid)
    {
          e.handled=true;
          int tabIndex = dg.TabIndex;
           tabindex++;
           Control control = GetControl(tabIndex); // You can use visual tree in the method to get it
           control.select();
           control.focus();
   }
 }

我道歉我写的是伪代码而不是真正的代码,因为我需要时间来回忆一下我在SL中使用的代码。

希望这个解决方案能够同时适用于您,当您选择退出数据网格并反向切换到数据网格时。