【问题标题】:binding itemsource of two way in codebehind?在代码后面绑定两种方式的itemssource?
【发布时间】:2014-12-13 15:17:39
【问题描述】:

有一个列表框与 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); }
    }
}

【问题讨论】:

  • 成员是列表吗?如果是这样,它不会实现 INotifyCollectionChanged,因此不会反映任何更改。
  • 是的,lbxMember 是 Member 类的属性。

标签: c# wpf data-binding itemsource


【解决方案1】:

你使用 ObservableCollection 隐藏,但你将它公开为 IEnumerable

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

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

【讨论】:

  • 我想把内容和容器分开,但我觉得没有意义。我了解 IEnumerable 与 ObservableCollection 之间的含义。谢谢布拉姆。
  • 如果你理解 IEnumerable 和 ObservableCollection 之间的意思,你就不会有这个问题了。
猜你喜欢
  • 2017-08-04
  • 2011-12-27
  • 1970-01-01
  • 2012-03-23
  • 2017-08-05
  • 2016-02-27
  • 2016-01-13
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多