如何实现字符串不区分大小写的唯一ObservableCollection

时间:2014-02-07 19:10:55

标签: .net observablecollection

如何实现字符串不区分大小写的唯一ObservableCollection?

对于数据输入,用户可以为他们经常使用的字符串值创建粘性物品 该列表需要不区分大小写并且已排序。

没有在SO上找到解决方案并实施了一个解决方案 它可能对某人有价值。
并且可能会得到更好的答案。

2 个答案:

答案 0 :(得分:1)

我认为你根本不应该对ObservableCollection进行排序,这不是它的设计目的......

在我看来,你的ObservableCollection上应该有一个CollectionViewSource,你的UI会用于绑定,并且可以通过添加SortDescription来轻松排序...... < / p>

private ICollectionView myCollectionView;
public ICollectionView MyCollectionView...

MyCollectionView.SortDescriptions.Add(new SortDescription(propertyName, 
    MyListSortDir));

这样你就不必修改你的Collection,而是在它上面使用一层抽象,你可以绑定它而不是绑定到实际的集合,并且你可以随心所欲地做任何事情(包括任何你喜欢的)排序类型)而不影响基础集体......

答案 1 :(得分:0)

这就是我想出来的

using System.Collections.ObjectModel;
namespace OCstringUnique2
{
    public partial class MainWindow : Window
    {
        private OCstringUniqueSorted myCol = new OCstringUniqueSorted();
        public MainWindow()
        {
            myCol.Add("bb");
            myCol.Add("aa");
            myCol.Add("zz");
            this.DataContext = this;
            InitializeComponent();
        }
        public OCstringUniqueSorted MyCol { get { return myCol; } }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string s = tbNew.Text;
            MyCol.Add(s);
        }
    }
    public class OCstringUniqueSorted : ObservableCollection<string> 
    {
        public new void Add(string item)
        {
            if (item == null) return;
            item = item.Trim();
            if (String.IsNullOrEmpty(item)) return;
            if (this.Contains(item)) return;
            if (this.Contains(item, StringComparer.CurrentCultureIgnoreCase)) return;
            base.Add(item);
        }
        protected override void InsertItem(int index, string item)
        {
            int i = 0;
            foreach(string s in this)
            {
                if(string.Compare(s,item,true) >= 0)
                {
                    base.InsertItem(i, item);
                    return;
                }
                i++;
            }
            base.InsertItem(i, item);
        }
    }
}

<Grid>
    <StackPanel Orientation="Vertical">
        <TextBox Width="100" HorizontalAlignment="Left" x:Name="tbNew" />
        <Button Content="Add" Click="Button_Click" Width="40" HorizontalAlignment="Left"/>
        <ListBox ItemsSource="{Binding Path=MyCol}"/>
    </StackPanel>
</Grid>