在DataGridTemplateColumn中绑定

时间:2012-11-10 19:11:34

标签: wpf entity-framework binding lazy-loading selecteditem

我已经使用实体框架从数据库中获取了学术文献集合。

LecturersLecturerListViewModel内的属性:

public ObservableCollection<Lecturer> Lecturers { get; set; }

Lecturer是来自数据库逆向工程的课程:

public class Lecturer
{
    public Lecturer()
    {
    }

    public int Id_Lecturer { get; set; }
    public string Name { get; set; }
    public int? Academic_Degree_Id { get; set; }
    public virtual AcademicDegree AcademicDegree { get; set; } // lazy loading
}

我想在DataGrid中显示数据库中的所有讲师(网格的所有单元格都是可编辑的;当用户点击保存按钮时,所有数据都将保存在数据库中)。 问题是最近的学位与组合框的约束力。我试过这种方式:

<StackPanel d:DataContext="{d:DesignInstance Type=ViewModel:LecturerListViewModel}">
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Lecturers}" HeadersVisibility="Column">
        <DataGrid.Columns>

            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            <DataGridTemplateColumn Header="Academic degree">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <!-- PROBLEM HERE. SelectedItem="{Binding AcademicDegree}" doesn't work -->
                        <ComboBox SelectedItem="{Binding AcademicDegree}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AcademicDegrees}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Add" HorizontalAlignment="Center" Width="100"  Margin="15" Name="AddLecturerButton" />
</StackPanel>

ItemsSource="{Binding Lecturers}"正确绑定。点击checkbox后有列表。但是在程序启动后,checkboxes中的值为空。为什么?我该如何解决?

PS。 LecturerListViewModel在代码隐藏中绑定。

2 个答案:

答案 0 :(得分:0)

您的对象需要通过INotifyPropertyChanged提供更改通知。 (因此,如果完成延迟加载,则需要为属性进行通知)

答案 1 :(得分:0)

如果要将Enum值绑定到组合框,则必须提供具有枚举值的IEnumerable。实现这一目标的最简单方法是在资源中定义ObjectDataProvider

 xmlns:System="clr-namespace:System;assembly=mscorlib"
 xmlns:MyEnums="clr-namespace:LocalNamespaceWhereAcademicDegreeIsDefined"    
 ...
 <Window.Resources>
     <ObjectDataProvider x:Key="AcademicDegrees" MethodName="GetValues" ObjectType="{x:Type System:Enum}" >
         <ObjectDataProvider.MethodParameters>
             <x:Type TypeName="MyEnums:AcademicDegree"/>
          </ObjectDataProvider.MethodParameters>
     </ObjectDataProvider>
 <Window.Resources>
 ...
 ...
 <ComboBox SelectedItem="{Binding AcademicDegree}" ItemsSource="{Binding Source={StaticResource AcademicDegrees}}" />
 ...
 ...