2012-11-10 79 views
0

我有学术造型师从数据库中使用实体框架获取的集合。DataGridTemplateColumn中的绑定

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显示所有从数据库中的讲师(的所有单元该网格是可编辑的;当用户点击保存按钮的所有数据将是s在数据库中存储)。 问题在于最近的学位对组合框的约束。我试过这种方式:

<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

您的物品需要通过INotifyPropertyChanged提供更改通知。 (所以如果延迟加载完成,需要为属性发出通知)

+0

嘿!绑定到'Name'即使没有实现'INotifyPropertyChanged'也能工作。只是'ComboBox'不能正常工作。我已将“Lecturer”类更改为[此版本](http://wklej.org/id/867503/),但“ComboBoxes”中仍然没有选定的值。怎么了? –

+1

@ patryk.beza:有太多的事情可以* *是错误的,通知只是其中最常见的原因... –

0

如果要将枚举值绑定到组合框,则必须提供带有枚举值的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}}" /> 
... 
... 
+0

你试过了吗? – Christian

相关问题