Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не биндятся данные к combobox в WPF DataGrid / 4 сообщений из 4, страница 1 из 1
07.08.2015, 12:31
    #39024956
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не биндятся данные к combobox в WPF DataGrid
Использую WPF и Entity Framework, по MVVM шаблону.
Есть View - ConductorsView, связана с ConductorsViewModel.
На вьюшке Датагрид, где отображаются собственно кондукторы. Одну из колонок нужно сделать комбобоксом, что-бы можно было выбирать значения из списка.
Вот пример ConductorsViewModel:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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 код датагрида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<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>



В комбобоксе пусто, значения в колонке пустые. Пробовал всякие варианты, не получается.
В чем может быть проблемма?
...
Рейтинг: 0 / 0
08.08.2015, 12:07
    #39025476
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не биндятся данные к combobox в WPF DataGrid
Дело в том, что вы пытаетесь привязать к свойству ItemsSource, свойства из объекта Conductor, так как контекст ячейки указывает именно на этот объект в случае с DataGridComboBoxColumn.
Тут есть 2 пути:
а) создать ObjectDataProvider в ресурсах, и связывать свойство ItemsSource именно с этим статическим объектов. Binding устроен так, что ObjectDataProvider для него является прозрачным. соотвественно связывание будет выглядеть как то так:
ItemsSource="{Binding Source={StaticResource OdpBrigades}}"
б) так как ячейка находится в DataGrid, а у DataGrid контекст класс WorkspaceViewModel, то можно с помощью RelativeSource найти DataGrid, и обратиться к его свойству DataContext
примерно так:
ItemsSource="{Binding DataContext.Brigades, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"

-) не уверен, что такой метод сработает, можно так же именовать контрол DataGrid и обратиться к нему через ElementName, но скорее всего работать не будет.
...
Рейтинг: 0 / 0
13.08.2015, 08:53
    #39028289
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не биндятся данные к combobox в WPF DataGrid
Первый с созданием статического объекта в xaml не очень понравился.
Второй вариант никак не хотел работать, DataGrid просто не находился и ничего не работало. Как потом выяснилось, - из-за того, что он не находится в одном дереве контролов. В итоге заработал такой вариант:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<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>
...
Рейтинг: 0 / 0
13.08.2015, 09:00
    #39028294
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не биндятся данные к combobox в WPF DataGrid
Eugene7Первый с созданием статического объекта в xaml не очень понравился.
Второй вариант никак не хотел работать, DataGrid просто не находился и ничего не работало. Как потом выяснилось, - из-за того, что он не находится в одном дереве контролов. В итоге заработал такой вариант:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<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>


кстати говоря :) в ячейке на самом деле не ComboBox, а "internal class TextBlockComboBox : ComboBox", отличается он только собственным стилем и IsTabStop по умолчанию false =)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не биндятся данные к combobox в WPF DataGrid / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]