2013-04-30 2 views
0

Я пытаюсь связать ObservableCollection T с DataGridComboBoxColumn DataGrid.
определение DataGrid является:Binding DataGridComboBoxColumn

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Model, IsAsync=True}"> 

    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column Entry" IsReadOnly="True" Binding="{Binding ColumnName}"/> 
     <DataGridComboBoxColumn Header="Road Type" ItemsSource="{Binding RoadTypes}"/> 
    </DataGrid.Columns> 

</DataGrid> 

Это ViewModel и модель

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var viewModel = new ViewModel(); 
     DataContext = viewModel; 
    } 
} 

public class ViewModel : ViewModelBase 
{ 
    private ObservableCollection<Model> _model; 

    public ViewModel() 
    { 
     var list = new List<Model>(); 
     var roadTypes = new ObservableCollection<RoadType> 
          { 
           new RoadType 
            { 
             Code = 1, 
             Id = 1, 
             Name = "Name1" 
            }, 
           new RoadType 
            { 
             Code = 1, 
             Id = 1, 
             Name = "Name1" 
            } 
          }; 

     Model = new ObservableCollection<Model> 
        { 
         new Model 
          { 
           ColumnName = "Col1", 
           RoadTypes = roadTypes 
          }, 
         new Model 
          { 
           ColumnName = "Col1", 
           RoadTypes = roadTypes 
          } 
        }; 
    } 

    public ObservableCollection<Model> Model 
    { 
     get { return _model; } 
     set 
     { 
      _model = value; 
      RaisePropertyChanged(() => Model); 
     } 
    } 
} 

public class RoadType 
{ 
    public int Id { get; set; } 
    public int Code { get; set; } 

    public string Name { get; set; } 
} 

public class Model : ObservableObject 
{ 
    private ObservableCollection<RoadType> _roadTypes; 
    public string ColumnName { get; set; } 

    public ObservableCollection<RoadType> RoadTypes 
    { 
     get { return _roadTypes; } 
     set 
     { 
      _roadTypes = value; 
      RaisePropertyChanged(() => RoadTypes); 
     } 
    } 
} 

DataGrid отображает текстовую колонку, как хорошо, но она не отображает значения ComboBox.
Что случилось?

ответ

6

Поскольку RoadTypes - это не простой список строк, вам нужно сообщить свой combobox, какое свойство нужно отображать в ComboBox. Попробуйте добавить

DisplayMemberPath="Name" 

вашему declartion поле со списком

-

Обновление:

Хорошо, это известная "особенность" с WPF DataGrids. Проблема в том, что DataGridComboBox не имеет DataContext для DataGrid. Я изменил связывание для ComboBox, чтобы выглядеть следующим образом:

<DataGridComboBoxColumn DisplayMemberPath="Name"> 
    <DataGridComboBoxColumn.ElementStyle> 
      <Style> 
       <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" /> 
      </Style> 
     </DataGridComboBoxColumn.ElementStyle> 
     <DataGridComboBoxColumn.EditingElementStyle> 
       <Style> 
        <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" /> 
       </Style> 
     </DataGridComboBoxColumn.EditingElementStyle> 
    </DataGridComboBoxColumn> 

Я изменил код, который вы предоставили в ссылке загрузки и элементы ComboBox были показаны, когда я открыл COMBOBOX ниспадающего меню.

Проверьте некоторые из этих ссылок для дальнейшего уточнения:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b4b13a72-47f9-452f-85c6-6c4b5b606df5/

How to bind collection to WPF:DataGridComboBoxColumn

Excedrin headache #3.5.40128.1: Using combo boxes with the WPF DataGrid

Что заставило меня посмотреть на всех этих сайтах, глядя в окно Output и замечая сообщение об ошибке Ошибка System.Windows.Data: 2: Не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для таргетинга et element. Сообщение

+0

Пробовал, но он не работал. – Unforgiven

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