尝试将WPF组合框绑定到List <t> </t>时出现问题

时间:2012-04-13 22:44:54

标签: wpf xaml combobox

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

在窗口的ctor中,我有代码返回名为_allUsers的List。此调用成功,列表中填入适当数量的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>

但是没有快乐(组合框仍然坚决地空着)

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

好的,然后你需要将DataContext设置为后面的代码作为一个整体在窗口的顶部

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

使AllUsers成为返回allUsers的公共属性

绑定到AllUsers

 ItemsSource="{Binding Path=AllUsers}"

答案 1 :(得分:2)

最终为我解决了BindingExpression path error: 'GivenName' property not found on 'object' ''ApplicationUser'错误消息!

这会让每个人都生病,但是当我准备编辑我的问题以包含一些截图来证明“爆破的东西确实有一个叫做x和y的属性以及输出窗口到底是什么知道!“我说我最好检查一下我是否正确实现了对象ApplicationUser。

果然我没有,我已经把我认为的属性留作公开可变字段(!)。我把它们变成了自动道具,然后我最初发布的代码工作了。

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

答案 2 :(得分:1)

我认为您的问题出在时间上,这是由您分配DataContext的原因引起的。 XAML resovles

ItemsSource="{Binding}"

在InitializeComponent()期间,但你可能会在之后的列表,这为时已晚。

当XAML获得构建/解析时,comboBox接受Binding,但那里什么也没有。有很多方法可以解决:

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

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

    删除:

    cboListOfUsers.DataContext = _allUsers;
    

    添加/替换

    cboListOfUsers.ItemsSource = _allUsers;
    
  3. 3.在InitializeComponent()之前输入_allUsers,然后将其分配给DataContext

    还有一个建议 - 在xaml中调试绑定,添加:

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

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

    我认为应该有用..

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