【问题标题】:DisplayMemberPath databindingDisplayMemberPath 数据绑定
【发布时间】:2014-12-12 17:37:58
【问题描述】:

我在 WPF 中遇到了一个令人困惑的数据绑定问题。 XAML 中有一个列表框,它与 ItemSource 链接, 但是当它运行时,它会显示类名列表。 所以我已经申请了 DisplayMemberPath,但它没有帮助。 而且我想知道如何从泛型类访问类内部。 谢谢。

结果

puzzled.Member
puzzled.Member
puzzled.Member
puzzled.Member

<DockPanel>        
    <ListBox Name="lbxMbrList" DockPanel.Dock="Left" Width="200" Padding="10"></ListBox>
    <ContentControl />
</DockPanel>

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    members.Add(new Member("superman", "123-1234567", "address1"));
    members.Add(new Member("batman", "111-111111", "address2"));
    members.Add(new Member("goodman", "222-222222", "address3"));
    members.Add(new Member("badman", "333-333333", "address4"));

    lbxMbrList.ItemsSource = members;
    lbxMbrList.DisplayMemberPath = members.MemberDetails;   //<<it won't helpful

    //var i = members.member.Name;                          //<<how can I access inside class?
    //if (i == "superman")
    //{
    //    MessageBox.Show("superman");
    //}

}

public class Member
{
    private string _name;
    private string _phone;
    private string _address;

    public string Name { get { return _name; } set { _name = value; } }
    public string Phone { get { return _phone; } set { _phone = value; } }
    public string Address { get { return _address; } set { _address = value; } }

    public Member() { }

    public Member(string name, string phone, string address)
    {
        _name = name; _phone = phone; _address = address;
    }

    public string lbxMember
    {
        get { return string.Format("{0} - {1}", Name, Phone, Address); }
    }

}

class MemberList : IEnumerable<Member>
{
    private ObservableCollection<Member> memberList = new ObservableCollection<Member>();

    public Member this[int i]
    {
        get {return memberList[i];}
        set {memberList[i] = value;}
    }

    public void Add(Member member)
    {
        memberList.Add(member);
    }

    public void Remove(Member member)
    {
        memberList.Remove(member);
    }

    public IEnumerator<Member> GetEnumerator()
    {
        return memberList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } 



    public Member member { get; set; }     //<< it think I has misunderstood it
    public string MemberDetails
    {
        get
        { return string.Format("{0} - {1}", member.Name, member.Phone, member.Address); }
    }

}  

【问题讨论】:

    标签: wpf data-binding itemsource


    【解决方案1】:

    您正在将 MemberDetails 属性的输出分配给 DisplayMemberPath。相反,您需要将属性的名称指定为字符串。

    lbxMbrList.DisplayMemberPath = "MemberDetails";
    

    不管怎样,如果您在 ListBox 中使用 ItemTemplate,这将更容易使用。

    [编辑]

    另外,正如@Blam 在他的回答中提到的,您的 MemberDetails 属性定义在错误的类中,它需要在 Member 类中。

    【讨论】:

    • 这个答案不正确。看可以回答。 “MemberDetails”不是 Member 的属性。
    • @Blam 你的回答解决了这个问题
    • @Blam 如您所知,问题是 OP 不了解需要分配给 DisplayMemberPath 的内容
    • 谢谢沃尔特,你救了我的命。圣诞快乐。
    【解决方案2】:
    lbxMbrList.DisplayMemberPath = "lbxMember";
    

    lbxMbrList.DisplayMemberPath = "MemberDetails";
    

    而且 MemberDetails 需要是 Member 的一个属性(不是 MemberList)

    【讨论】:

    • 谢谢 Blam,我不能再说谢谢了。圣诞快乐。
    • 如果回答了问题,您可以检查一下。
    • 我很想为你的感谢投票,但我不能,它说我需要至少 15 个声望。
    • 我发现检查是什么意思。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多