我正在根据来自服务的数据模型详细信息动态创建数据条目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;
}
这可以按预期工作,但是当在行中进行选项卡时,键盘焦点永远不会被设置到如上定义的组合框中。为了能够选择下拉列表,我需要使用鼠标。
非常感谢任何帮助。
答案 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以查看更多详细信息。