【问题标题】:what does DisplayMemberPath="Value" do when trying to bind data? [duplicate]DisplayMemberPath="Value" 在尝试绑定数据时会做什么? [复制]
【发布时间】:2015-04-22 10:46:31
【问题描述】:

我对 DisplayMemberPath="Value" 的工作原理及其用途感到非常困惑。我复制了其他人的代码,但它从来没有以我期望的方式对我有用,而是在我单击组合框时出现错误。

“System.Reflection.TargetException”类型的异常发生在 mscorlib.dll 中,并且未在托管/本机边界之前处理

附加信息:对象与目标类型不匹配。

我的代码是

    <ComboBox Height="40" VerticalAlignment="Stretch" SelectedValuePath="Key" DisplayMemberPath="Value" x:Name="comboBox1" FontSize="25"/>

var source = new Dictionary<int, string>();
            source.Add(1,"Item1");
            source.Add(2,"Item2");
            source.Add(3,"Item3");
            source.Add(4,"Item4");

            var formateDSource = new Dictionary<string, string>();

            foreach (var item in source)
            {
                formateDSource.Add(string.Format("[{0}, {1}]", item.Key, item.Value), item.Key);
            }

            comboBox1.ItemsSource = source;

基本上,当我运行我的代码时,我希望在我的组合框中看到这样的列表:

项目1项目2项目3项目4

现在虽然我插入了一个包含键和值的字典,但我希望我的值会显示在我的组合框中,如上所示。这不是我们使用 DisplayMemberPath="Value" 的目的吗?那么为什么它会给我上面的错误呢?

当我从我的代码中删除 DisplayMemberPath="Value" 时,我的组合框可以工作,但会将其显示为列表:

[1,Item1] [2,Item2] [3,Item3] [4,Item4]

这对我没有好处,因为我不希望我的用户只看到键值。我可以将代码更改为:

comboBox1.ItemsSource = source.Values;

效果很好,但是我的组合框没有值的键,因此使我更难以获得用户选择的内容,或者这是获得我想要的结果的正确方法,而不是 DisplayMemberPath="价值”。如果我被误解了,有人可以解释 DisplayMemberPath="Value" 的使用以及为什么我的代码不起作用或如何获得我想要的结果吗?对不起,只是为那些有疑问的人补充。我已经将我的代码作为 wpf 应用程序进行了尝试,它运行良好,但作为 Windows 商店应用程序,它可以满足我的需要。为什么会这样,是否有一种适用于 Windows 商店应用程序的方法

【问题讨论】:

  • formateDSource 是干什么用的?你好像没用过
  • 这与您之前的问题有何不同?从您在此处发布的内容来看,无法说明为什么 DisplayMemberPath="Value" 不起作用。它应该简单地工作,而且确实对我们其他人有用。您的应用程序中必须有更多,其他导致此错误的东西。
  • 您是否将 SelectedValue 绑定到非 int 类型?这似乎是您的错误的可能来源。

标签: c# xaml combobox windows-store-apps windows-8.1


【解决方案1】:

通常你会为你的组合框提供某种列表或集合。

假设您有一个名为 Person 的类

class Person{
  public string Name{get;set;}
  public int Age{get;set;}
 }

现在您可以为组合框提供人员列表,但您的组合框将显示 Project.Person 或 ToString 方法显示的任何内容。

但你可以在 DisplayMemberPath 中指定姓名,然后它会显示人的姓名。

【讨论】:

  • 这些是这个问题的完美答案。新来的,所以不确定投反对票的原因。
【解决方案2】:

当你绑定 X 类型的项目集合时,DisplayMemberPath 用于设置 X 的哪个属性将用作显示值。当您的项目类型中有一个可以简单地显示为文本的漂亮字符串值时,这是一种避免需要数据模板的简单机制。在您的示例中,它正在您的项目类型上寻找一个名为 Value 的属性。

【讨论】:

  • 是的。为什么它找不到那个属性?
  • 你能显示你的整个 xaml 文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2020-07-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多