所以我正在开发一个应用程序,它使用 MVVM 结构向用户显示数据并让他们修改它。我目前遇到的问题是这样的:
从 RadGridView 中选择实体后,我将用户查看的该成员添加到 ObservableCollection。然后我看到 RadListBox 得到填充(意味着我可以将鼠标悬停在该项目上)但没有显示任何内容。该对象是我从服务中引用的 DataContract。我尝试了多种修复方法,但无济于事。
有一次我开始使用 Snoop 并注意到无论我将 DisplayMemberPath 设置为什么值,DisplayMemberPath 始终是“名称”。当我在 Snoop 中时,如果我将值 DisplayMemberPath 更改为 FirstName,该名称将在我的 WPF 应用程序中弹出。
我已经盯着这个看了一段时间,可能只需要一双新的眼睛。以下是相关代码:
XAML 代码:
<Grid MinHeight="70">
<TextBlock Text="No Members viewed"
FontWeight="Bold"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Visibility="{Binding TextBlockVisibility, FallbackValue=Visible, Mode=OneWay}">
</TextBlock>
<telerik:RadListBox Name="uRecenetlyViewMembersListBox"
DataContext="{Binding MemberInfo}"
SelectionMode="Single"
DisplayMemberPath="{Binding FirstName}"
ItemsSource="{Binding RecentlyViewedMembers}"
SelectedItem="{Binding SelectedRecentlyViewedMember,Mode=TwoWay}"
Visibility="{Binding WorkingListNoRecordsVisibility, FallbackValue=Visible, Mode=OneWay}"
MouseDoubleClick="uRecenetlyViewMembersListBox_MouseDoubleClick">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding RecentlyViewedSelectionChanged}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadListBox>
</Grid>
2/11 编辑:所以我删除了 DataContext,因为不清楚它是否可以工作,因为上下文指向正确的 ViewModel。并更改了 DisplayMemberPath 并删除了绑定。
<Grid MinHeight="70">
<TextBlock Text="No Members viewed"
FontWeight="Bold"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Visibility="{Binding TextBlockVisibility, FallbackValue=Visible, Mode=OneWay}">
</TextBlock>
<telerik:RadListBox Name="uRecenetlyViewMembersListBox"
SelectionMode="Single"
DisplayMemberPath="FirstName"
ItemsSource="{Binding RecentlyViewedMembers}"
SelectedItem="{Binding SelectedRecentlyViewedMember,Mode=TwoWay}"
Visibility="{Binding WorkingListNoRecordsVisibility, FallbackValue=Visible, Mode=OneWay}"
MouseDoubleClick="uRecenetlyViewMembersListBox_MouseDoubleClick">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding RecentlyViewedSelectionChanged}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadListBox>
</Grid>
和 c# 代码:
private const UInt16 recentlyViewedMemberCapacity = 10;
private ObservableCollection<Member> recentlyViewedMembers;
public ObservableCollection<Member> RecentlyViewedMembers
{
get { return this.recentlyViewedMembers; }
set
{
if (value != recentlyViewedMembers)
{
this.recentlyViewedMembers = value;
//ugly & inefficient: needs refactoring
//recentlyViewedMembers = (ObservableCollection<RecentlyViewedMember>)recentlyViewedMembers.OrderByDescending(item => item.DateAdded);
while (recentlyViewedMembers.Count > recentlyViewedMemberCapacity)
recentlyViewedMembers.RemoveAt(recentlyViewedMemberCapacity);
this.RaisePropertyChanged(() => this.RecentlyViewedMembers);
ValidateWorkingListVisibility();
}
}
}
这是从服务返回的 DataContract,只有必要的部分:
[DataContract(Name = "Member")]
public class Member : INotifyPropertyChanged
{
public Member();
[DataMember(Order = 0)]
public string FirstName { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}