我已经使用实体框架从数据库中获取了学术文献集合。
Lecturers
是LecturerListViewModel
内的属性:
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
在代码隐藏中绑定。
答案 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}}" />
...
...