如何实现字符串不区分大小写的唯一ObservableCollection?
对于数据输入,用户可以为他们经常使用的字符串值创建粘性物品 该列表需要不区分大小写并且已排序。
没有在SO上找到解决方案并实施了一个解决方案
它可能对某人有价值。
并且可能会得到更好的答案。
答案 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>