是否可以在加载数据网格时使WPF工具包数据网格的DataGridComboBoxColumn暴露在外?默认情况下,您必须单击单元格以显示组合框。我希望用户看到组合框可用,而不必单击单元格。我希望组合框立即可用,单元格中的第一次单击实际上会使组合框下拉。当前,您必须单击单元格,然后单击组合框下拉菜单以显示值。
V.S。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS82dzNsdy5wbmcifQ==” alt =“正确的外观”>
XAML:
<dg:DataGridComboBoxColumn x:Name="ctrlStatus" Header="Status" Width="Auto" SelectedValueBinding="{Binding Port}" SelectedValuePath="Status">
<dg:DataGridComboBoxColumn.CellStyle>
<Style TargetType="dg:DataGridCell">
<EventSetter Event="Selector.SelectionChanged" Handler="SelectionChanged"/>
</Style>
</dg:DataGridComboBoxColumn.CellStyle>
</dg:DataGridComboBoxColumn>
后面的代码:
List<string> _statusList;
public List<string> StatusList
{
get
{
return _statusList;
}
set
{
_statusList = value;
ctrlStatus.ItemsSource = _statusList;
}
}
谢谢,GAR8
最终解决方案:XAML
<telerik:GridViewComboBoxColumn Header="Status">
<telerik:GridViewComboBoxColumn.CellTemplate>
<DataTemplate>
<telerik:RadComboBox ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" SelectedValue="{Binding Port}" SelectedValuePath="Status" SelectionChanged="SelectionChanged"/>
</DataTemplate>
</telerik:GridViewComboBoxColumn.CellTemplate>
</telerik:GridViewComboBoxColumn>
后面的代码:
List<string> _statusList;
public List<string> StatusList
{
get { return _statusList; }
set { _statusList = value; }
}
您可以使用DataGridTemplateColumn并将ComboBox用作单元格编辑模板,而无需指定非编辑模板。这将使DataGrid始终使用ComboBox。
更新根据您的评论要求,下面是一个示例。请注意,该示例并不是最佳选择,我会选择其他设计,但是我以某种方式做到了这一点,以便它可以集成到您的解决方案中而不会带来更大的问题。我还没有测试。如果有误,请发表评论。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellEditingTemplate >
<DataTemplate>
<ComboBox x:Name="ctrlStatus"
SelectedValueBinding="{Binding Port}"
SelectedValuePath="Status">
SelectionChanged="SelectionChanged"
ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
要使用上面的代码,StatusList必须实现更改通知。如果您的DataGrid不在aWindow中,而是在另一个类中,例如在UserControl中,请在相对源中替换类型名称。
尝试一下
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource=”{Binding Path=YourSource...}”
Text=”{Binding Path=YourSource...}”/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate >
<DataTemplate>
<ComboBox ItemsSource=”{Binding Path=YourSource...}”
Text=”{Binding Path=YourSource...}”/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
基本上,在两种情况下都定义ComboBox分别是CellTemplate和CellEditingTemplate。
请参阅我之前写的post,因为我为单元格的状态编写了单独的模板用于非编辑(最初看到)和编辑(单击组合框时看到)。现在,您可以像上面在XAML中所做的那样,以非编辑方式复制编辑代码,您的问题将得到解决。
如果需要经常使用,则可以定义一个自定义列:
public class DataGridCustomComboBoxColumn : DataGridComboBoxColumn
{
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
return base.GenerateEditingElement(cell, dataItem);
}
}
然后可以用它代替普通的DataGridComboBoxColumn
。