2014-12-13 41 views
0

有一个listbox与itemsource绑定。 我想在此之后更改集合的数据。 添加数据的点击按钮不会改变列表框。在代码隐藏中的两种方式绑定itemsource?

然后我添加itemsource后的更新,但它使PresentatonFramework.pdb不加载,InvalidOperationException未处理。 我有点理解,这是一种方式绑定。 你能给我一些帮助吗?

private MemberList members = new MemberList(); 

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 = "lbxMember"; 

    //members.Add(new Member("puzzedman", "000-0000000", "address0")); //<<it makes a strange error message. 
    } 

    //I want a button to update the listbox's content 
    private void Add_Click(object sender, RoutedEventArgs e) 
    { 
     members.Add(new Member("puzzedman", "444-4444444", "address5")); 
    } 

    private void Clear_Click(object sender, RoutedEventArgs e) 
    { 
     members.Clear(); 
    } 


update: 

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 void Clear() 
    { 
     memberList.Clear(); 
    } 
} 

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); } 
    } 
} 
+0

'lbxMember'属于'Member'类的属性吗? – 2014-12-13 15:19:39

+0

是否是成员列表?如果是这样,它不会实现INotifyCollectionChanged,因此不反映更改。 – Maximus 2014-12-13 15:22:06

+0

是的,lbxMember是Member类的一个属性。 – 2014-12-13 15:22:13

回答

1

您使用的ObservableCollection下盖,但将其公开为IEnumerable

IEnuerable不处理通知插入的UI和删除。

为什么不直接使用ObservableCollection并跳过这个MemberList?

+0

我想分割内容和容器,但我认为这是不合理的。我理解IEnumerable与ObservableCollection之间的方法。谢谢Blam。 – 2014-12-13 16:15:37

+0

如果你理解IEnumerable与ObservableCollection之间的方法,你不会有这个问题。 – Paparazzi 2014-12-13 18:59:03