2016-03-17 4 views
1

Как создать простой DataGridComboboxColumn?Как создать простой DataGridComboboxColumn?

Я пытаюсь создать строку с двумя полями: string и combobox с некоторыми параметрами. Я могу его жестко закодировать.

Но это не работает. Когда я нажимаю кнопку «Добавить строку»: строка создана, но я могу редактировать только текстовое поле и никаких показов combobox.

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

Класс Row:

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?

+0

возможно, из-за того, что свойство ReadOnly имеет значение true? –

+0

Нет, это не сработает. –

+1

@AdmiralLand: удалить IsReadOnly = «True» из DataGridComboBoxColumn XAML и дважды щелкнуть по столбцу со списком. Вы получите комбо-поле. Я получаю поле со списком, используя ваш код. –

ответ

2

Удалить IsReadOnly = "True" из DataGridComboBoxColumn XAML и дважды щелкнуть по столбцу со списком. Вы получите комбо-бокс. Я получаю поле со списком, используя ваш код.

Это связано с тем, что в сетке данных есть текстовый блок в качестве шаблона ячейки, и при попытке изменить его с помощью двойного щелчка он меняет шаблон ячейки в «Редактировать шаблон ячейки», а шаблон редактирования сетки данных использует поле со списком, поскольку это внутренний контроль.

+0

Я не жадный, но если это то, что вы ищете, тогда вы должны отметить это как ответ. Так что кто-то ищет решение может найти его легко :) –

Смежные вопросы