我有一个属性:ObservableDictonary<string, CustomClass> ModuleConnections
并创建了一个集合视图源,如下所示:
<CollectionViewSource x:Key="ModuleConnectionSorter" Source="{Binding ModuleConnections}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Key" Direction="Ascending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
使用:
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
我也创建了自己的比较器:
public class AddressComparer : IComparer<string>
{
public int Compare(string firstAddress, string secondAddress)
{
uint firstTddressInteger = AddressToUint(firstAddress);
uint secondAddressInteger = AddressToUint(secondAddress);
if (firstAddressInteger < secondAddressInteger)
{
return -1;
}
else if (firstAddressInteger > secondAddressInteger)
{
return 1;
}
else
{
return 0;
}
}
private static uint AddressToUint(string Address)
{
var addressIP = IPAddress.Parse(Address).GetAddressBytes();
Array.Reverse(addressIP);
return BitConverter.ToUInt32(addressIP, 0);
}
}
互联网给了我这个选择:
private void MainWindowLoaded(object sender, System.Windows.RoutedEventArgs e)
{
CollectionViewSource source = (CollectionViewSource)(this.Resources["ModuleConnectionSorter"]);
ListCollectionView view = (ListCollectionView)source.View;
view.CustomSort = (IComparer)new TCAddressComparer();
}
但是我无法做到这一点,因为我得到了一个&#39; System.InvalidCastException&#39;出现以下错误:
Cannot convert object of type MS.Internal.Data.EnumerableCollectionView to System.Windows.Data.ListCollectionView.
这可能与我没有绑定列表但ObservableDictionary(实际上与字典相同)的事实有关。
因为我不能以正常的方式(我不喜欢)这样做,我想我会创建自己的SortDescription一个CustomSortDescription,如果你愿意的话。当我想到这样做时,我想知道为什么没有其他人这样做,很快我就清楚地知道那也不会成为一个解决方案。
我想(天真的我)我会简单地继承sortdescription并创建我自己的派生版本:
public class CustomSortDescription : SortDescription
任何人都可以帮我解决问题吗?我只想在键(字符串)上对ObservableDictionary进行排序。
更新:
我已经做了一个工作,而不是更多的工作围绕更多的工作。但是我现在正在做的是每次我在字典中添加一些内容时我都会对字典进行排序:
var sortedIOrderedEnumerable = this.ModuleConnections.OrderBy(keyValuePair => keyValuePair.Key, new TCAddressComparer());
mModuleConnections = new ObservableDictionary<string, ModuleConnection>(sortedIOrderedEnumerable.ToDictionary(keyValuePair => keyValuePair.Key, keyValuePair => keyValuePair.Value));
RaisePropertyChanged(() => this.ModuleConnections);
这不是应该如何完成的,我仍然在寻找一种方法来对XAML代码中的视图(而不是数据源)进行排序。