首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid CellTemplate TabNavigation

DataGrid CellTemplate TabNavigation
EN

Stack Overflow用户
提问于 2013-09-10 00:36:26
回答 2查看 838关注 0票数 2

我假设之前有人问过这个问题,但我找不到,所以请让我知道这是不是与其他词语或其他东西重复发现的。

问题出在SL4 DataGrid,它包含多个CellTemplate,包括CheckboxButton等。默认情况下,它只会在第一行切换这些元素。如果我设置了TabNavigation="Cycle",它将切换到所有元素,但它不会移动到下一个元素,而只是在相同的DataGrid中重复切换。

如果我将其设置为Once,那么它将再次仅在第一个row....and SL4上切换,当它到达边缘时,似乎没有Continue选项移动到下一个对象上。

我正在寻找一种简单的方法来获取TabNavigation="Cycle"的等价物,除了当它到达DataGrid中最后一个可用tab键的元素时,它会移动到树中的下一个元素,而不是再次返回到DataGrid中的第一个元素。这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

发布于 2013-12-10 04:46:07

在Silverlight中似乎没有一种原生的方法来做到这一点,以下是数据网格控件中支持的键击的列表:http://msdn.microsoft.com/en-us/library/cc838112(v=vs.95).aspx

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

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2013-12-12 14:08:22

很久以前,我和SL4有过一些经验。我会试一试你的问题:

看看你为获得你想要的行为而设置的属性将不起作用。这将只是Microsoft的方式,因此替代方案是编写您自己的代码来实现所需的行为。

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

代码语言:javascript
复制
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中使用的代码。

当你跳出数据网格和反转到数据网格时,我希望这个解决方案对你两方面都有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18702916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档