2014-02-04 3 views
0

У меня есть DataGrid с ComboboxКак связать массив для DataGridComboBoxColumn WPF

<DataGridComboBoxColumn Header="Header 2" ItemsSource="{Binding Pet}"> 

проект, основанный на MVVM шаблон. При попытке отобразить данные на TextColumn, он работает

<DataGridTextColumn Header="Header 1" Binding="{Binding ID}" /> 

Но, я не знаю, как связать данные для DataGridComboBoxColumn.

Код модели:

public string ID 
    { 
     get { return _id; } 
     set { _id = value; NotifyPropertyChanged("ID"); } 
    } 
    public string[] Pet 
    { 
     get { return _pet; } 
     set { _pet = value; NotifyPropertyChanged("Pet"); } 
    } 

ответ

6

Вместо использования <DataGridComboBoxColumn> попробовать использовать <DataGridTemplateColumn> как этот

<DataGridTemplateColumn Header="ID"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{Binding Path=DataContext.Pet, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" SelectedItem="{Binding ID}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

в этом примере я связан мой источник элемента управления ComboBox в качестве Pet массива сбора меди определяемое в моей текущей модели ViewModel и выбранном элементе как свойство ID коллекции <>, связанной с полным DataGrid.

+0

Спасибо за ответ, но это не работает для меня. У меня есть модель 'public class ListItem', которая содержит свойство' public string [] Pet', и я пытаюсь получить данные из него. Должен ли я изменить тип собственности Pet? Кроме того, я связал '' раньше, и поэтому привязка для '' отлично работает. –

+1

Предполагая, что ListItems - это коллекция класса ListItem. Затем просто проигнорируйте часть RelativeSource в привязке и просто напишите '' и он должен работать –

+0

Большое спасибо! –

0

DataGridComboBoxColumn и DataGridTextColumn не будет участвовать в логическом дереве. Поэтому привязка не будет работать в этом. Вы можете преодолеть это ниже двумя способами, 1. Определите модель представления в качестве статического ресурса и StaticResource связывания 2. Вы можете использовать RelativeSource связывания, который также будет работать для вашего случая

см ниже блог для получения дополнительной информации о как сделать, http://blogs.msdn.com/b/vinsibal/archive/2008/08/28/wpf-datagrid-working-with-datagridcomboboxcolumns-part-2.aspx

+0

Я пытался связать как StaticResource 'ItemsSource =" {Binding Source = {StaticResource Pet}} ", и я получил сообщение об ошибке« XamlParseException » –

+0

, вы можете ссылаться на приведенную ниже ссылку: http://lfhck.com/question/378365/binding-itemssource-of- a-comboboxcolumn-in-wpf-datagrid – Sivakumar

0

У меня была такая же проблема на день сейчас, и нашел, что это будет лучшим решением, так как это не беспорядок просчета выпадающий список:

  <DataGridComboBoxColumn Header="ID" SelectedItemBinding="{Binding ID}"> 
       <DataGridComboBoxColumn.ElementStyle> 
        <Style TargetType="ComboBox"> 
         <Setter Property="ItemsSource" Value="{Binding Pet}"/> 
         <Setter Property="IsReadOnly" Value="True"/> 
        </Style> 
       </DataGridComboBoxColumn.ElementStyle> 
       <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="ComboBox"> 
         <Setter Property="ItemsSource" Value="{Binding Pet}"/> 
        </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 
Смежные вопросы