我经历了大量的尝试和论坛帖子,但我仍然无法解决我的问题。
问题 显示来自实体框架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>
请帮忙;我将不胜感激!
答案 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;}
....
}