0

所以我正在开发一个应用程序,它使用 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;
}
4

1 回答 1

0

尝试设置DisplayMemberPath为硬编码的属性名称而不是绑定:

DisplayMemberPath="FirstName"

在标准 WPF 的 ListBox 中,DisplayMemberPath应设置为要显示的路径(表示属性名称),而不是值。所以在我的理解中,即使绑定有效,它也会设置DisplayMemberPathFirstName属性值而不是属性名。

希望这也适用于 Telerik 的 RadListBox。

于 2014-02-11T00:56:54.933 回答