2014-02-11 30 views
0

因此,我正在使用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; 
} 

回答

0

嘗試設置DisplayMemberPath以硬編碼的屬性名稱,而不是結合:

DisplayMemberPath="FirstName" 

在標準WPF的列表框中,DisplayMemberPath應該設置爲要顯示的路徑(表示屬性名稱),而不是值。所以在我的理解中,即使綁定起作用,它也會將DisplayMemberPath設置爲值FirstName屬性而不是屬性名稱。

希望這也適用於telerik的RadListBox。

+0

是的,我在我的許多測試之一。這是我最終打破了駱駝的基礎。我明天會更改它並讓你知道,但是如果我沒有記錯,我沒有設置DataContext並且DisplayMemberPath =「FirstName」。難道DataContract沒有RaisePropertyChange? – user2595595

+0

仍然沒有變化,並且DisplayMemberPath在snoop中仍顯示爲「Name」 – user2595595

相關問題