【问题标题】:Custom ObservableCollection<string> with additional functions具有附加功能的自定义 ObservableCollection<string>
【发布时间】:2014-11-20 14:11:18
【问题描述】:

我想创建一个自定义ObservableCollection&lt;string&gt; 以在 WPF 中与 MVVM 一起使用。我的实际目标是通过两个属性来扩展标准ObservableCollection&lt;string&gt;,它们返回选定的索引和选定的项目,以及通过检查给定字符串是否在集合中的方法。目前看起来是这样的:

public class MyStringCollection : ObservableCollection<string>
{
    private int _selectedIndex;
    private ObservableCollection<string> _strings;

    public MyStringCollection() : base()
    {
        _selectedIndex = 0;
        _strings = new ObservableCollection<string>();
    }

    /// <summary>
    /// Index selected by the user
    /// </summary>
    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set { _selectedIndex = value; }
    }

    /// <summary>
    /// Item selected by the user
    /// </summary>
    public string Selected
    {
        get { return _strings[SelectedIndex]; }
    }

    /// <summary>
    /// Check if MyStringCollection contains the specified string
    /// </summary>
    /// <param name="str">The specified string to check</param>
    /// <returns></returns>
    public bool Contains(string str)
    {
        return (_strings.Any(c => (String.Compare(str, c) == 0)));
    }        
}

尽管MyStringCollection 继承自ObservableCollection&lt;string&gt;,但标准方法,如AddClear 等,将不起作用。当然,那是因为我每次创建 MyStringCollection 的实例时都会创建一个单独的实例_strings

我的问题是如何在不手动添加这些功能的情况下向/从我的 ObservableCollection&lt;string&gt;() 添加/清除元素?

【问题讨论】:

  • 仅供参考,如果您可以使用 LINQ,则无需定义自己的 Contains 方法。只需添加using System.Linq;,您就可以在ObservableCollection&lt;T&gt; 上使用IEnumerable 扩展方法Containsmsdn.microsoft.com/en-us/library/…

标签: c# mvvm observablecollection


【解决方案1】:

您从ObservableCollection&lt;T&gt; 派生,因此this 是对您的收藏的引用。你只需要

public string Selected
{
    get { return this[SelectedIndex]; }
}

public bool Contains(string str)
{
    return (this.Any(c => (String.Compare(str, c) == 0)));
}        

请注意Contains() already exists as an extension method

【讨论】:

  • 谢谢!你说得对,Contains() 已经作为扩展方法存在;但是,它使用 Equals on object,它只是检查内存地址是否相同。相反,我想检查字符串的内容是否相同。
  • C#中,String.Equals(string)比较字符串的值;不是内存地址。 msdn.microsoft.com/en-us/library/fbh501kz%28v=vs.110%29.aspx
【解决方案2】:

我不确定你想要实现什么,但你不应该从 ObservableCollection&lt;string&gt; 继承,更喜欢 composition 而不是 inheritance。实际上你已经差不多完成了(你已经有一个private ObservableCollection&lt;string&gt; _strings 成员)。

例如:Prefer composition over inheritance?

回到你最初的需求,如果你在做 MVVM,很可能你想公开 both ObservableCollection&lt;T&gt; MyObjects 属性和 T MySelectedObject 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多