我正在开展一个项目,我需要向用户提供一些树视图。到目前为止,我已经设法将我的业务对象及其持久性提供给一个完全正常运行的数据库。
我正在使用NHibernate和SQLite3来存储对象。业务对象如下:
public class ErrorObject
{
public virtual int ID { get; set; }
public virtual string Description { get; set; }
private IList<ErrorObject> _errorObjects = new List<ErrorObject>();
public virtual IList<ErrorObject> ErrorObjects
{
get { return _errorObjects; }
set { _errorObjects = value; }
}
}
我将此绑定到这样的树视图:
<TreeView ItemsSource="{Binding ErrorObjects}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type DataModel:ErrorObject}"
ItemsSource="{Binding ErrorObjects}">
<TextBlock Text="{Binding Path=Description}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
让我感到困惑的是,只要我不关闭NHibernate会话,我就可以开箱即用的完全延迟加载:o)
如果这是继续的方式,有人可以建议吗?或者我有一个有缺陷的概念?
答案 0 :(得分:0)
似乎是个好主意。
在.NET 3.5 SP1中,已向TreeView添加了虚拟化支持(通过向VirtualizingStackPanel添加对分层数据的支持)。
只要NHibernate在请求时填充子列表ErrorObjects(首次访问getter),树就会以延迟加载的方式构建。
答案 1 :(得分:0)
这就是设计工作的方式,所以请高兴: - )
答案 2 :(得分:0)
如果您希望在集合更新时更新用户界面,则应该制作ErrorObject
工具INotifyPropertyChanged
/ INotifyCollectionChanged
,或制作{{1属性为ErrorObjects
,ObservableCollection<T>
实现INotifyCollectionChanged
和INotifyPropertyChanged
`。
我认为对您的方案最好的想法是使用ObservableCollection<ErrorObject>
而不是ObservableCollection
,如果我没有错,List
也会实现ObservableCollection<T>
。