@SitrixEug

Почему не биндятся данные к combobox в WPF DataGrid?

Использую WPF и Entity Framework, по MVVM шаблону.
Есть View - ConductorsView, связана с ConductorsViewModel.
На вьюшке Датагрид, где отображаются собственно кондукторы. Одну из колонок нужно сделать комбобоксом, что-бы можно было выбирать значения из списка.
Вот пример ConductorsViewModel:
class ConductorsViewModel : WorkspaceViewModel, IDisposable
    {
        /// <summary>
        /// Контекст для работы с БД
        /// </summary>
        private PUTLEntities db;

        /// <summary>
        /// Коллекция оболочка для работы с кондукторами
        /// </summary>
        public ObservableCollection<Conductor> Conductors { get; set; }

        /// <summary>
        /// Коллекция оболочка Brigades
        /// </summary>
        public ObservableCollection<Brigade> Brigades { get; set; }

        /// <summary>
        /// Коллекция сообщений(лог)
        /// </summary>
        public ObservableCollection<string> Messages { get; private set; }



        #region Constructor

        public ConductorsViewModel()
        {
            Messages = new ObservableCollection<string>();
            base.DisplayName = Resources.ConductorsViewModel_DisplayName;
            db = (PUTLEntities)PutlDbProvider.GetDbContainer();

            Conductors = new ObservableCollection<Conductor>(db.Conductors);
            Brigades = new ObservableCollection<Brigade>(db.Brigades);

            Save = new DelegateCommand(this.SaveHandler);
        }

        #endregion // Constructor


И собственно XAML код датагрида:
<DataGrid ItemsSource="{Binding Path=Conductors}" AutoGenerateColumns="False" Margin="0,-8,0,8" Grid.ColumnSpan="5">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding CondNo}" Header="Номер"/>
                <DataGridTextColumn Binding="{Binding FIO}" Header="ФИО"/>
                <DataGridTextColumn Binding="{Binding DateHire}" Header="Дата приема"/>
                <DataGridTextColumn Binding="{Binding DateDismiss}" Header="Дата увольнения"/>
                <DataGridComboBoxColumn ItemsSource="{Binding Source=Brigades}" Header="Колона" Width="auto" SelectedItemBinding="{Binding FK_Brigade}" />
            </DataGrid.Columns>
        </DataGrid>


Но работать никак не хочет. В комбобоксе пусто, значения в колонке пустые. Пробовал всякие варианты, не получается.
В чем может быть проблемма?
  • Вопрос задан
  • 2231 просмотр
Решения вопроса 2
@Sumor
У DataGridComboBoxColumn DataContext это конкретный объект типа Conductor.
А ItemsSource должен откуда-то взять список. И видимо в Conductor такого списка нет.
Есть несколько вариантов:
1 Через биндинг связаться с DataGrid и от него взять список Brigares
2 Определить где-то статический список Brigades, например в ConductorsViewModel. После чего сослаться на него через {x:Static local:ConductorsViewModel.Brigades}
3 Иметь ссылку на список Brigades в каждом элементе Conductor и тогда в биндинге просто указываете это свойство.
Ответ написан
Комментировать
@SitrixEug Автор вопроса
Датаконтекстом действительно оказался конкретный объект Conductor.
Вариант со статическим объектом мне не понравился. RelativeSource сначала не находил DataGrid. Что-бы через RelativeSource найти DataGrid, пришлось сделать следующим образом:

<DataGridComboBoxColumn Header="Колонна" Width="auto" SelectedValueBinding="{Binding Brigade}" DisplayMemberPath="Brigade1">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Brigades}"/>
                            <Setter Property="IsReadOnly" Value="True"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Brigades}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы