3

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

ISSUE 显示来自实体框架 dbcontext 的数据的组合框不显示所选值,但对项目列表有效。所选项目仅显示

System.Data.Entity.DynamicProxies.Equipment_37EBC79AEAECCCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702

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

SETUP 我有一个包含名为设备的类的 dbcontext。设备有两个我要显示字符串标签的项目;地点名称;

选定的项目被破坏,列出作品

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

请帮忙; 我将不胜感激!

4

3 回答 3

4

已解决 - 其他信息

好的,我想出了制作连接属性的方法(如@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 花时间提出建议。

于 2013-08-07T22:07:41.647 回答
2

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

我相信如果未设置此选项,ComboBox则只会调用ToString()所选项目。这将解释您在实际中获得的价值ComboBox

DisplayMemberPath只是一个字符串,需要一个绑定路径,所以不幸的是你不能给它一个多重绑定。我从未使用过实体框架,但是是否可以覆盖ToString()您返回的对象,或者添加一个包含您想要的值的属性,然后将其用于 的值DisplayMemberPath

于 2013-08-06T00:49:44.077 回答
1

如果您使用实体框架代码,请首先检查您是否缺少模型中的某些虚拟属性。就像是:

public class Equipment{
    ....
    public virtual Location Location {get; set;}
    ....
}
于 2013-08-06T04:23:01.507 回答