自定义 ObservableCollection 具有附加函数

本文关键字:函数 ObservableCollection string 自定义 | 更新日期: 2023-09-27 18:31:16

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

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<string>,标准方法,如AddClear等,也不起作用。当然,这是因为每次创建 MyStringCollection 的实例时,我都会创建一个单独的实例_strings

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

自定义 ObservableCollection<string> 具有附加函数

> 您是从ObservableCollection<T>派生的this因此它是对您的集合的引用。您所需要的只是

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

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

请注意,Contains()已作为扩展方法存在。

我不确定您要实现的目标,但您不应该从ObservableCollection<string>继承,更喜欢组合而不是继承。实际上你已经差不多完成了(你已经有一个private ObservableCollection<string> _strings成员了)。

例如:更喜欢组合而不是继承?

回到最初的要求,如果你正在执行 MVVM,很可能你想要同时公开一个ObservableCollection<T> MyObjects属性和一个T MySelectedObject属性。