【问题标题】:Issue when attempting to get WPF combo box to bind to List<T>尝试让 WPF 组合框绑定到 List<T> 时出现问题
【发布时间】:2012-04-13 22:44:54
【问题描述】:

我有一个名为 ApplicationUser 的自定义类,它有许多属性。这里重要的是 GivenName 和 Surname。

在窗口的 ctor 中,我有返回名为 _allUsers 的列表的代码。此调用成功,列表中填充了适当数量的 ApplicationUsers

然后我会做类似的事情:

_allUsers = CachingLayer.Get<List<ApplicationUser>>("allUserInformation");
cboListOfUsers.DataContext = _allUsers;

还有 XAML:

        <ComboBox Name="cboListOfUsers" ItemsSource="{Binding}" IsEnabled="{Binding Path = IsChecked, ElementName=rbAssignedTo}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                    <TextBlock.Text >
                        <MultiBinding StringFormat=" {0}, {1} ">
                            <Binding Path="Surname" />
                            <Binding Path="GivenName" />
                        </MultiBinding>
                    </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

但是没有乐趣(组合框仍然是空的)

我在这里做错了什么?

【问题讨论】:

  • 查看您的输出窗口,看看是否有任何绑定错误。
  • 尝试去掉 IsEnabled 部分。
  • @Blam - 我已经尝试将其关闭,抱歉没有指定...
  • @m-y 输出窗口中没有明显的绑定错误
  • @m-y 现在得到 System.Windows.Data 警告:40:BindingExpression 路径错误:在“对象”“ApplicationUser”(HashCode=257207)上找不到“GivenName”属性。绑定表达式:路径=给定名称; DataItem='ApplicationUser' (HashCode=257207);目标元素是'TextBlock'(名称='');目标属性是我的输出窗口中的“文本”(输入“字符串”)错误

标签: wpf xaml combobox


【解决方案1】:

好的,那么您需要将 DataContext 设置为整个窗口顶部的代码

   DataContext="{Binding RelativeSource={RelativeSource self}}"

将 AllUsers 设为返回 allUsers 的公共属性

绑定到所有用户

 ItemsSource="{Binding Path=AllUsers}"

【讨论】:

    【解决方案2】:

    是BindingExpression path error: 'GivenName' property not found on 'object' ''ApplicationUser' 错误信息终于帮我解决了!

    这会让每个人都感到恶心,但是当我准备编辑我的问题以包含一些屏幕截图以证明“该死的东西确实有一个名为 x 和 y 的属性以及输出窗口到底是什么知道!”我说我最好检查一下我是否正确实现了对象 ApplicationUser。

    果然我没有,我把我认为是属性的东西作为公共可变字段(!)。我把它们变成了自动道具,然后我最初发布的代码就可以工作了。

    我要向所有阅读问题、评论和建议答案的人道歉并感谢他们。我在这里留下这个答案的目的是双重的,以帮助其他可能发现自己处于类似情况的人,并提醒自己,有时如果您看不到树木的树林,那么您可能需要后退一点。

    【讨论】:

    • 哦,伙计,多么痛苦!但你明白了,这才是最重要的。退后一步也是如此。回到学校那天,我有一位教授告诉我。一旦他说,丹尼斯,把你的前额从显示器和键盘上拿开!感谢您发布此信息,这让我发疯了,我整个周末都在想这个
    • 感谢丹尼斯的所有帮助! :-)
    【解决方案3】:

    我认为您的问题在于时间问题,这是由您分配 DataContext 的位置引起的。 XAML 解决方案

    ItemsSource="{Binding}"
    

    在 InitializeComponent() 期间,但之后您可能正在初始化列表,这为时已晚。

    当 XAML 被构建/解析时,comboBox 接受绑定,但那里什么都没有。解决方法很多:

    1. 最简单的方法是在 XAML 中进行:

    2. 为什么还要设置 DataContext,看起来你没有做任何特别的事情,它只是一个列表,而不是一个完整的 ViewModel..

      删除:

      cboListOfUsers.DataContext = _allUsers;
      

      添加/替换为

      cboListOfUsers.ItemsSource = _allUsers;
      

    3.在InitializeComponent()之前初始化你的_allUsers,然后将它分配给DataContext

    另一个建议 - 在 xaml 中调试您的绑定,添加:

    ItemsSource="{Binding, diagnostics:PresentationTraceSources.TraceLevel=High}"
    

    检查你的输出窗口,如果你有异常,那么我是对的,绑定试图解决,但是那里什么都没有......

    我认为这应该可行..

    另外,看看这篇文章: Why are DataContext and ItemsSource not redundant?

    【讨论】:

    • 尝试在 InitializeComponent() 之前分配组合框的 DataContext 会导致 NullReferenceException
    • 尝试调试绑定会导致错误:XML 命名空间“schemas.microsoft.com/winfx/2006/xaml/presentation”中不存在标记“绑定”。第 13 行位置 110
    • 嗯,我不敢相信这不起作用,在构造函数中: _allUsers = CachingLayer.Get>("allUserInformation");初始化组件(); cboListOfUsers.ItemSource= _allUsers;
    • 是的,它按照您在那里的顺序工作,但根本问题不是顺序,而是定义类的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多