我有一个名为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>
但是没有快乐(组合框仍然坚决地空着)
我在这里做错了什么?
答案 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,但那里什么也没有。有很多方法可以解决:
最简单的方法是在XAML中执行:
为什么即使设置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?