【问题标题】:DisplayMemberPath reverts back to Name after setting to something elseDisplayMemberPath 在设置为其他内容后恢复为 Name
【发布时间】:2014-02-11 00:48:15
【问题描述】:

所以我正在开发一个使用 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;
}

【问题讨论】:

    标签: c# wpf xaml telerik telerik-radlistbox


    【解决方案1】:

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

    DisplayMemberPath="FirstName"
    

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

    希望这也适用于 Telerik 的 RadListBox。

    【讨论】:

    • 是的,我在众多测试中的一项中做到了这一点。这是我最终打破骆驼的构建。明天我会更改它并让您知道,但如果我没记错的话,我没有设置 DataContext 并且 DisplayMemberPath = "FirstName"。会不会是 DataContract 没有 RaisePropertyChange?
    • 仍然没有变化,DisplayMemberPath 在 snoop 中仍然显示为“名称”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2019-01-22
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多