因此,我正在使用MVVM結構向用戶顯示數據和修改它的應用程序。我目前遇到的問題是這樣的:DisplayMemberPath在設置爲其他內容後恢復爲Name
從RadGridView中選擇一個實體後,我添加該用戶查看ObservableCollection的成員。然後我看到RadListBox的get填充(意味着我可以懸停在該項目上),但沒有顯示任何內容。對象是我從服務引用的DataContract。我嘗試了許多修補程序,但無濟於事。
有一次我開始使用Snoop,並注意到無論我將DisplayMemberPath設置爲DisplayMemberPath的值是否始終爲「Name」。當我在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的,因爲它是目前還不清楚,如果它甚至曾作爲上下文指向正確的視圖模型。並更改了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;
}
是的,我在我的許多測試之一。這是我最終打破了駱駝的基礎。我明天會更改它並讓你知道,但是如果我沒有記錯,我沒有設置DataContext並且DisplayMemberPath =「FirstName」。難道DataContract沒有RaisePropertyChange? – user2595595
仍然沒有變化,並且DisplayMemberPath在snoop中仍顯示爲「Name」 – user2595595