WPF组合框选择项错误 - 显示“System.Data.Entity.DynamicProxies”

时间:2013-08-06 00:18:15

标签: c# wpf binding combobox

我经历了大量的尝试和论坛帖子,但我仍然无法解决我的问题。

问题 显示来自实体框架dbcontext的数据的组合框不显示所选值,但DOES适用于项目列表。 所选项目只显示

  

System.Data.Entity.DynamicProxies.Equipment_37EBC79AEAECCCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702

但组合框列表正确显示....

SETUP 我有一个dbcontext,其中包含一个名为equipment的类。 设备有两个我想要显示的项目 字符串标签; Location.Name;

所选项目已被破坏,列表无效

  <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。

如果我忽略位置(从数据源拖放获得),下面的工作原理。 这会正确显示列表和所选项目。

<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>

请帮忙;我将不胜感激!

3 个答案:

答案 0 :(得分:2)

已解决 - 为其他人提供信息

好的,我想出了一个连接属性的方法(比如@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 + ")"; } } 

然后,这允许我使用以下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花时间提出建议。

答案 1 :(得分:1)

两个代码示例之间的一个区别是,在第二个代码示例中,它将ComboBox.DisplayMemberPath设置为某个内容。

我相信如果没有设置,ComboBox只会在所选项目上调用ToString()。这可以解释您在实际ComboBox中获得的价值。

DisplayMemberPath只是一个字符串,需要一个绑定路径,所以不幸的是你不能给它一个多绑定。我从来没有使用过实体框架,但是可以为你得到的对象重写ToString(),或者添加一个包含你想要的值的属性,然后使用它作为{{{ 1}}?

答案 2 :(得分:1)

如果您正在使用实体框架代码,请首先检查您是否遗漏了模型中的某些虚拟属性。类似的东西:

public class Equipment{
    ....
    public virtual Location Location {get; set;}
    ....
}