【发布时间】:2017-03-05 00:23:10
【问题描述】:
注意:修正了 SummeryName 的错字以避免混淆。
我正在尝试将一个简单的 DataGrid 绑定到可按列排序的 ObservableCollection。这是一个简单的设置:
<DataGrid ItemsSource="{Binding Path=DocuObjects}" CanUserSortColumns="True" SelectedItem="{Binding Path=SelectedDocu}" AutoGenerateColumns="false">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" SortMemberPath="SummaryName" Width="*" Binding="{Binding SummaryName}" />
</DataGrid.Columns>
</DataGrid>
绑定源是一个简单的集合:
public ObservableCollection<DocuObject> DocuObjects
{
get { return m_Docus; }
set
{
m_Docus= value;
RaisePropertyChanged("DocuObjects");
}
}
每次单击列标题时,都会出现异常:
System.Windows.Data 错误:55:无法按“SummaryName”排序 InvalidOperationException:'System.InvalidOperationException: 失败 比较数组中的两个元素。 ---> System.ArgumentException:在 至少一个对象必须实现 IComparable。
很明显,下一步我将在 DocuObject 类中实现 IComparable,正如异常所暗示的那样。但这似乎没有任何作用,无论我添加 IComparable 还是 IComparable。异常仍然发生,当我添加断点时,我的 CompareTo() 代码没有受到影响。
出于测试目的,我已将代码简化为 this - 但 NotImplementedException 甚至没有受到影响。
public class DocuObject: INotifyPropertyChanged, IEquatable<DocuObject>, IComparable<DocuObject>
{
...
public int CompareTo(DocuObject other)
{
throw new NotImplementedException();
}
}
我犯了什么根本性错误? SummaryName 本身是一个字符串,CompareTo 应该在其中工作
【问题讨论】:
-
显示DocuObject的结构
-
我刚做了。但是没什么可看的:-/
-
请提供有关 DocuObject 类的更多信息。 SummeryName 是什么类型的?这是 SummaryName 的错字吗?
-
请出示DocuObject的代码
-
SummaryName 不是字符串对象。 (不再 - 它曾经是一个。)所以听起来我需要在该自定义类上实现 IComparable 。会这样做并报告。