4

加载数据网格时是否可以“暴露” WPF 工具包数据网格的 DataGridComboBoxColumn?默认情况下,您必须单击单元格以显示组合框。我希望用户无需单击单元格即可看到组合框可用。我希望组合框立即可用,并且第一次单击单元格会使组合框实际下拉。当前,您必须单击单元格,然后单击组合框下拉列表以显示值。

不想要的外观

VS

正确的外观

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; }
}
4

3 回答 3

2

尝试这个

<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>

基本上,您在 CellTemplate 和 CellEditingTemplate 两种情况下都定义了 ComboBox。

请参阅我前段时间写的这篇文章,因为我为单元格的非编辑(您最初看到的)和编辑(当您单击即组合框时看到的)状态编写了单独的模板。现在您可以像我在上面的 XAML 中所做的那样,在非编辑中复制编辑代码,您的问题将得到解决

于 2011-08-09T17:22:46.120 回答
2

您可以使用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 中,请替换相关源中的类型名称。

于 2011-08-09T17:10:35.143 回答
0

如果您需要经常使用它,那么可以定义一个自定义列:

public class DataGridCustomComboBoxColumn : DataGridComboBoxColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        return base.GenerateEditingElement(cell, dataItem);
    }
}

然后可以使用它来代替正常的DataGridComboBoxColumn.

于 2019-11-07T08:53:14.030 回答