将包含DataGridComboBoxColumn选择的新DataGrid行保存回实体集

时间:2013-06-12 23:23:55

标签: wpf entity-framework-5 datagridcomboboxcolumn

::编辑注意事项::

我完全重写了这个问题,这是简化的标题(我的实体集名称和属性比这个类似的场景更难以遵循)。

:: / EDIT note ::

我一直在努力找到我能够看到的“缺少导航链接”并从DataGridComboBoxColumn保存回我的实体Context

我的实体设置:

InstructorClass

我的视图:绑定到“类”实体集的DataGrid。            它有两列:
  - DataGridComboBoxColumn(显示每个类的InstructorNames)
  - DataGridTextColumn(按名称显示类)

<DataGrid x:Name="DataGrid1" DockPanel.Dock="Top" Background="Transparent" 
              ItemsSource="{Binding ClassesObservableCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridComboBoxColumn Width="220" 
                                    Header="Instructor" 
                                    SelectedValueBinding="{Binding InstructorID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                    SelectedValuePath="InstructorID"
                                    DisplayMemberPath="InstructorName">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.InstructorsObservableCollection}"/>
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.InstructorsObservableCollection}"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
            </DataGridComboBoxColumn>

通过这一切都很痛苦,谢天谢地,它的效果非常好。更新使用DataGridComboBoxColumn选项工作,但NEW ROWS不保存.SaveChanges()

请帮我找到我遗失的内容。

它可能是在这个神秘的SelectedItemBinding属性中,我永远无法使用我的viewmodel上的支持属性发送更改通知吗?

我是否需要明确告诉我的绑定Classes实体如何保存每个属性? (这似乎不合理......似乎应该用xaml绑定来处理它。)

感谢您的阅读!

2 个答案:

答案 0 :(得分:0)

我认为你需要在cs文件中使用动态绑定。

1)如果在cs文件中创建绑定,则可以将oject传递给binding的converterParameter。您可以将ComboxColumn传递给转换器。

2)使用列元素获取当前选定的系列ID&amp; DataContext(ContactArrangement),并获取父控件的DataContext(PNSery集合)。

3)使用foreach枚举当前PNSery对象并分配给ContactArrangment对象。

答案 1 :(得分:0)

嗯,并不令人震惊,我需要手动将我的实体添加到我的ObjectContext中的实体集“Classes1”中。对我没有先尝试过这一点感到羞耻,但我认为所有详细的DataGrid绑定都能提供这种能力。我的新经验法则:如果导航属性中有任何类型的属性信息包含在实体中,我将不得不手动确保将这些实体添加到正确的实体集中。

叹息我之前因为没有吸取教训而感到愚蠢......令人尴尬...我的更新代码如下:

 public void SaveClassesWithInstructors()
    {

        foreach(Class1 cl in this._classesCollection.Where(x => x.ClassID == 0))
        {
            var classToCreate = this._context.Classes1.Create();
            classToCreate.InstructorID = ca.InstructorID;
            classToCreate.ClassName = ca.ClassName;
            this._context.Classes1.Add(classToCreate);
            this._context.SaveChanges();
        }
        RaisePropertyChanged("ClassesCollection");
    }

所以我想,至少对于那些需要使用实体框架从DataGrid列进行导航绑定和SaveChanges()的完整操作方法的人来说......这里是。