C# WPF组合框所选项目错误-显示";System.Data.Entity.DynamicProxies“;
我已经经历了无数次的尝试和论坛帖子,但我仍然无法解决我的问题 问题 显示实体框架dbcontext中数据的组合框不显示选定值,但适用于项目列表。 所选项目刚刚显示 System.Data.Entity.DynamicProxies.Equipment_37EBC79AECCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702 但是组合框的列表显示正确 设置 我有一个dbcontext,其中包含一个名为equipment的类。 设备有两个项目我想显示 字符串标签; 地点、名称 所选项目已损坏,列表正常运行C# WPF组合框所选项目错误-显示";System.Data.Entity.DynamicProxies“;,c#,wpf,binding,combobox,C#,Wpf,Binding,Combobox,我已经经历了无数次的尝试和论坛帖子,但我仍然无法解决我的问题 问题 显示实体框架dbcontext中数据的组合框不显示选定值,但适用于项目列表。 所选项目刚刚显示 System.Data.Entity.DynamicProxies.Equipment_37EBC79AECCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702 但是组合框的列表显示正确 设置 我有一个dbcontext,其中包含一个名为equipment的类。 设备有两个项目我想显示
<ComboBox x:Name="cbxCopyTo" Grid.Row="2" Grid.Column="1"
IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False"
ItemsSource="{Binding}">
<ComboBox.SelectedValue>
<DataTemplate>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" >
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="Tag" />
<Binding Path="Location.Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.SelectedValue>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" >
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="Tag" />
<Binding Path="Location.Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
您可以看到上面我甚至尝试显式地设置所选的值;但它不起作用。
我确实注意到,当我尝试使用转换器时,当我将转换器放入其中时,它从未被SelectedItem或SelectedValue调用
如果忽略位置(从datasource拖放获得),则下面的方法有效。
这将正确显示列表和所选项目
<Label Grid.Row="1" Grid.Column="0" Content="Copy From:" />
<ComboBox x:Name="cbxCopyTo" Grid.Row="1" Grid.Column="1"
IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False"
DisplayMemberPath="Tag" ItemsSource="{Binding}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
请帮忙;我将不胜感激 两个代码示例之间的一个区别是,在第二个示例中,它将
ComboBox.DisplayMemberPath
设置为某个值
我相信,如果未设置此选项,组合框
只会对所选项目调用ToString()
。这将解释您在实际的组合框中得到的值
DisplayMemberPath
只是一个字符串,需要一个绑定路径,因此很遗憾,您不能为其提供多重绑定。我从未使用过实体框架,但是否可以为您返回的对象重写ToString()
,或者添加包含所需值的属性,然后将该属性用于DisplayMemberPath
?的值(如果使用的是实体框架代码),请首先检查模型中是否缺少某些虚拟属性。比如:
public class Equipment{
....
public virtual Location Location {get; set;}
....
}
已解决-其他信息
好的,我想出了一种方法来创建一个连接属性(如@Andy所建议的),但它不会出现在数据库中
通过使用代码优先注释,您可以在EF模型上声明一个属性,该属性不会映射到数据库,但可以像任何db属性一样进行查询或绑定。这是在EF模型类的声明中完成的,如下所示:
/// <summary>
/// Creates concatenation object that will not be mapped in the database but will be in the
/// Object Relational Mapping (ORM) of the EF model.
/// </summary>
[NotMapped]
public string TagAndLocation { get { return Tag + " (" + Location.Name + ")"; } }
//
///创建连接对象,该对象不会映射到数据库中,但会映射到
///EF模型的对象关系映射(ORM)。
///
[未映射]
公共字符串TagAndLocation{get{return Tag+”(“+Location.Name+”);}
这样,我就可以通过以下XAML使用到“TagAndLocation”的简单绑定:
<ComboBox x:Name="cbxCopyTo" Grid.Row="2" Grid.Column="1"
IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False"
DisplayMemberPath="TagAndLocation" ItemsSource="{Binding}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
再次感谢@Andy和@aguedo valdes花时间提出建议。感谢@Andy,我感谢你的回答。选择使用不同的成员是我的退路;但由于其他因素,我更希望数据库中没有这个。也是为了让我学会使用它,因为这正是我在这个装订材料上的皮毛。如果有人有其他的解决方案,我很想听听。谢谢你的回答。我有。我非常适合组合框下拉列表中显示的所有项目。。。只是不适用于所选项目…bump-其他人有什么想法吗?