我有一个非常简单的数据库,包含两个表,一个表示Books,另一个表示其他类型。我已经使用Entity Framework模型第一代来创建它,现在我想在WPF Datagrid中表示它。 Datagrid应该将Book的类型显示为Combobox列,但我无法正确绑定它。
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestApp"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ObjectDataProvider IsAsynchronous="True" x:Key="BookDataProvider" ObjectType="{x:Type local:BookDataProvider}">
</ObjectDataProvider>
<ObjectDataProvider x:Key="Books" ObjectInstance="{StaticResource BookDataProvider}" MethodName="GetAllBooks"></ObjectDataProvider>
<ObjectDataProvider x:Key="GenreDataProvider" ObjectType="{x:Type local:GenreDataProvider}" IsAsynchronous="True">
</ObjectDataProvider>
<ObjectDataProvider x:Key="Genres" ObjectInstance="{StaticResource GenreDataProvider}" MethodName="GetAllGenres"></ObjectDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource Books}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="179*" />
<ColumnDefinition Width="32*" />
<ColumnDefinition Width="292*" />
</Grid.ColumnDefinitions>
<DataGrid AutoGenerateColumns="False" Grid.ColumnSpan="3" Height="311" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="503" SelectionChanged="dataGrid1_SelectionChanged" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Title" Binding="{Binding Title}" />
<DataGridTextColumn Header="ISBN" Binding="{Binding ISBN}"/>
<DataGridTextColumn Header="Author" Binding="{Binding Author_AuthorName}"/>
<DataGridComboBoxColumn Visibility="Visible" IsReadOnly="False" Header="Genre" SelectedItemBinding="{Binding Genre}" SelectedValuePath="Genre" DisplayMemberPath="Name" ItemsSource="{Binding Source={StaticResource Genres}}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这显示了combox中的类型列表,但是当我运行应用程序时,我无法让它显示每本书的正确类型。
答案 0 :(得分:1)
我认为您不应该同时使用所选的项目绑定和选定的值路径。我会选择第一个。此外,您不应该处理所选项目已更改事件,这不是非常mvvm-ish,而是处理您实体的INotifyPropertyChanged。
如果这不能解决问题,那么我认为问题必须在您的模型类中。要使此绑定起作用,必须将实体对象的类型属性设置为可用类型列表中完全相同的类型实例,即。两者必须是完全相同的对象。