使用GridColumn.CellTemplate时,Tab焦点不起作用

时间:2017-02-03 11:30:05

标签: c# wpf devexpress

我正在根据来自服务的数据模型详细信息动态创建数据条目WPF DataGrid。我做的其中一件事是定义用户可以从中选择的组合框,例如:国家

我以编程方式定义DataTemplate并将其设置为GridColumn.CellTemplate

colToAdd = new GridColumn
{
    FieldName = field.name,
    Binding = new Binding { Path = new PropertyPath(string.Format("Order.OrderData[{0}]", field.name)), Mode = BindingMode.TwoWay },
    Header = GridCreationHelper.GenerateColumnHeader(field), 
    HeaderToolTip = string.Format("Order - {0}", myTI.ToTitleCase(field.name.ExpandTitleCaseToWords())),
    VisibleIndex = colIndex,
    AllowEditing = DefaultBoolean.True,
    AllowGrouping = DefaultBoolean.True,
    CellTemplate = GridCreationHelper.GenerateComboBoxDataTemplate(ViewModel.SelectedOrderType, field.name, View.Name, ViewModel.ComboBoxValues[ViewModel.SelectedOrderType][field.name].Count),
    HeaderStyle = GridCreationHelper.IsFieldMandatory(field) ? View.Resources["OrderEntryMandatoryHeaderStyle"] as Style : null,
    AllowFocus = true
};

实际的DataTemplate定义如下:

public static DataTemplate GenerateComboBoxDataTemplate(OrderType orderType, string columnName, string viewName, int comboBoxCount)
    {
        string selectedIndexMarkup = comboBoxCount == 1 ? " SelectedIndex=\"0\"" : string.Empty;

        string markup =
            string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                xmlns:dxe=""http://schemas.devexpress.com/winfx/2008/xaml/editors"" xmlns:Key=""ComboBoxEditDataTemplate"">
            <dxe:ComboBoxEdit xmlns:Name=""PART_Editor"" IsTabStop=""True"" Focusable=""True"" ImmediatePopup=""True"" IsTextEditable=""False"" SelectAllOnGotFocus=""True""
                              ItemsSource=""{{Binding Path=ViewModel.ComboBoxValues[{0}][{1}], ElementName={2}}}"" SelectedItem=""{{Binding Path=RowData.Row.Order.OrderData[{1}]}}""{3} />
        </DataTemplate>", orderType, columnName, viewName, selectedIndexMarkup);

        StringReader stringReader = new StringReader(markup);
        XmlReader xmlReader = XmlReader.Create(stringReader);
        return XamlReader.Load(xmlReader) as DataTemplate;
    }

这可以按预期工作,但是当在行中进行选项卡时,键盘焦点永远不会被设置到如上定义的组合框中。为了能够选择下拉列表,我需要使用鼠标。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

似乎与DevExpress的an old issue相关:

  

我们发现问题出现是因为IsTabStop属性   在代码中设置为True。你可能知道,我们的编辑是   复合控件,里面包含标准的TextBox控件。至   支持键盘导航,我们为其设置了IsTabStop属性   &#34;外&#34;编辑器收到键盘焦点后,控制为False   将焦点转移到内心&#34;控件(TextBox)。以下触发器是   用于此目的:

<Style TargetType="{x:Type dxe:BaseEdit}">
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="IsTabStop" Value="False"/>
        </Trigger>
</Style>

他们论坛的建议是

  

我们还没有找到一种可接受的方法来解决这个问题   控制。我们可以建议的唯一解决方案似乎不是   将IsTabStop属性值设置为True(默认情况下为True)。我是   附加修改后的项目,包含必要的更改。

您可以从该帖子下载DXSample.zip以查看更多详细信息。