如何创建简单的 DataGridComboboxColumn?

Posted

技术标签:

【中文标题】如何创建简单的 DataGridComboboxColumn?【英文标题】:How to create simple DataGridComboboxColumn? 【发布时间】:2016-03-17 10:36:12 【问题描述】:

如何创建简单的DataGridComboboxColumn?

我尝试创建一个包含两个字段的行:字符串和带有一些参数的组合框。 我可以硬编码。

但是,它不起作用。当我单击“添加行”按钮时:已创建行,但我只能编辑文本框而没有组合框显示。

  <Grid >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="5*"></RowDefinition>
                        <RowDefinition Height="95*"></RowDefinition>
                    </Grid.RowDefinitions>
                    <ToolBar  Grid.Row="0"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="27" >
                        <Button x:Name="btAddAttr"  Click="btAddAttr_Click"  Height="22" Width="22"
                                    ToolTip="Add Row" 
                                >
                            <Button.Content>
                                <Image Source="/UI.Resources;component/PNGImages/ItemAdd.png"></Image>
                            </Button.Content>
                        </Button>
                        <Button x:Name="btDelAttr"  Click="btDelAttr_Click"  Height="22" Width="22"                                                        ToolTipService.ShowOnDisabled="True"
                                    ToolTip="Remove Row"
                                    >
                            <Button.Content>
                                <Image Source="/UI.Resources;component/PNGImages/ItemDel.png">
                                </Image>
                            </Button.Content>
                        </Button>
                    </ToolBar>
                    <Grid Grid.Row="1"  x:Name="grAttrs"   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"                             
                          >                            
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="25*"></ColumnDefinition>
                            <ColumnDefinition Width="25*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <DataGrid AutoGenerateColumns="False" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Name="dgAttfs"
                                  IsEnabled="True"
                                  IsReadOnly="False"
                                  CanUserAddRows="False"
                                  CanUserDeleteRows="False"
                                  Loaded="dgAttfs_Loaded"
                                  ItemsSource="Binding ObjectsViewModel.AttributeRowColl,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged"
                                  >
                            <DataGrid.Columns>
                                <DataGridTextColumn Binding="Binding Name" MinWidth="120" Width="Auto"  
                                                    Header="Name" />
                                <DataGridComboBoxColumn x:Name="typeAttributeColumn" MinWidth="220"
                                    IsReadOnly="True"
                                    SelectedItemBinding="Binding Path=TypeAttribute"                                        
                                    Header="List of types"                                                           
                                                        >
                                    <DataGridComboBoxColumn.ItemsSource>
                                        <col:ArrayList>
                                            <sys:String>Type1</sys:String>
                                            <sys:String>Type2</sys:String>
                                            <sys:String>Type3</sys:String>
                                            <sys:String>Type4</sys:String>
                                            <sys:String>Type5</sys:String>
                                            <sys:String>Type6</sys:String>
                                            <sys:String>Type7</sys:String>
                                            <sys:String>Type8</sys:String>
                                        </col:ArrayList>
                                    </DataGridComboBoxColumn.ItemsSource>                                                                               
                                </DataGridComboBoxColumn>                                    
                            </DataGrid.Columns>                                                                                              
                        </DataGrid>                             
                    </Grid>                        
                </Grid>

有一部分 XAML 代码。因此,我尝试使用 XAML 样式绑定类型集合,正如您在代码中看到的那样。 而且,我尝试在加载DataGrid 时绑定它。

  private void dgAttfs_Loaded(object sender, RoutedEventArgs e)
    
        List<String> ss = new List<string>();
        ss.Add("Test");
        typeAttributeColumn.ItemsSource = ss;
    

没有结果。

并且,当按钮点击时:

 private void btAddAttr_Click(object sender, RoutedEventArgs e)
    
        var obj = new Row(_sm);
        _viewModel.ObjectsViewModel.AttributeRowColl.Add(obj);
        typeAttributeColumn.ItemsSource = _viewModel.ObjectsViewModel.AttributeRowColl;
        DataContext = _viewModel;
    

类行:

   internal class Row:INotifyPropertyChanged

    private IServiceManager _serviceManager;

    private string _name;
    /// <summary>
    /// Имя Значения
    /// </summary>
    public string Name
    
        get
        
            return _name;
        

        set
        
            _name = value;
            OnPropertyChanged("Name");
        
    

    private ObservableCollection<String> _typesColl;
    public ObservableCollection<String> TypesColl
    
        get
        
            if (_typeAttribute == null)
                _typeAttribute = "Bit";

            return _typesColl;
        

        set
        
            _typesColl = value;
            OnPropertyChanged("TypesColl");
        
     

    private String _typeAttribute;
    public String TypeAttribute
    
        get
        
            return _typeAttribute;
        

        set
        
            _typeAttribute = value;
            OnPropertyChanged("TypeAttribute");
        
    



    public Row(IServiceManager serviceManager)
    
        _serviceManager = serviceManager;
        TypesColl = new ObservableCollection<string>();
        TypesColl = GetColl(serviceManager);           
    

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)
    
        PropertyChangedEventHandler eh = this.PropertyChanged;
        if (null != eh)
        
            eh(this, new PropertyChangedEventArgs(propName));
        
    
    #endregion
    

您能帮我吗,如何在 DataGridComboBoxColumn 中显示类型列表?

【问题讨论】:

可能是因为 ReadOnly 属性设置为 true? 不,它不起作用。 @AdmiralLand :从 DataGridComboBoxColumn XAML 中删除 IsReadOnly="True" 并双击组合框列。您将获得组合框。我正在使用您的代码获得组合框。 @NareshRavlani,将其发布为答案,我将提交。 【参考方案1】:

从 DataGridComboBoxColumn XAML 中删除 IsReadOnly="True" 并双击组合框列。你会得到组合框。我正在使用您的代码获取组合框。

这是因为数据网格有文本块作为单元格模板,当您尝试使用双击编辑它时,它会将单元格模板更改为编辑单元格模板,并且数据网格编辑模板使用组合框作为它的内部控件。

【讨论】:

我并不贪心,但如果这是您正在寻找的内容,那么您也应该将其标记为答案。这样寻找解决方案的人就可以轻松找到它:)

以上是关于如何创建简单的 DataGridComboboxColumn?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个简单的自定义视图?

如何创建简单的 jQuery 插件?

如何创建和显示最简单的短信?

如何使用 JavaScript/JQuery 创建一个简单的地图 [重复]

如何创建连接本地的临时表,而无需强制使用简单的显式创建表语句?

如何创建简单的导航测试用例 - Karma Testing Angular