C# WPF组合框所选项目错误-显示";System.Data.Entity.DynamicProxies“;

C# WPF组合框所选项目错误-显示";System.Data.Entity.DynamicProxies“;,c#,wpf,binding,combobox,C#,Wpf,Binding,Combobox,我已经经历了无数次的尝试和论坛帖子,但我仍然无法解决我的问题 问题 显示实体框架dbcontext中数据的组合框不显示选定值,但适用于项目列表。 所选项目刚刚显示 System.Data.Entity.DynamicProxies.Equipment_37EBC79AECCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702 但是组合框的列表显示正确 设置 我有一个dbcontext,其中包含一个名为equipment的类。 设备有两个项目我想显示

我已经经历了无数次的尝试和论坛帖子,但我仍然无法解决我的问题

问题 显示实体框架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-其他人有什么想法吗?