2

我正在使用 WPF 中的树视图

我有两个类用于填充树视图的两个级别。

第一个问题是我可以用一个查询来做到这一点,还是比我在下面实现的更好。

主要问题是我想包含h.ItemId和其他列,ViewDocItems并且仍然在树视图中实现层次结构。

现在TitlefromDocHistory类是树的根级别。

BaseNumberfromBaseHistory是第二层。

        public class DocHistory
        {
            private ObservableCollection<BaseHistory> mBaseHis = new ObservableCollection<BaseHistory>();

            public Guid Id { get; set; }
            public Guid ClassId { get; set; }
            public string Title { get; set; }


            public ObservableCollection<BaseHistory> BaseHis { get { return mBaseline; } }
        }



        public class BaseHistory
        {
           public Guid BaseId { get; set; }
           public string BaseName { get; set; }
           public int BaseNumber { get; set; }
           public bool BaseFinal { get; set; }
        }



                   //this guid is only for testing
                    mGuid = new Guid("0497F3DA-AE3E-40C7-AF91-9B26EEE2A437");

                    var query = (from d in mContext.Docs
                                 orderby d.Title ascending
                                 join b in mContext.Base on d.DocId equals b.DocId
                                 join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
                                 where h.ItemId == mGuid
                                 select d).Distinct();
                    List<Database.Doc> DocList = query.ToList();

                    foreach (Database.Doc result in DocList)
                    {
                        DocHistory newHistory = new DocuHistory() { Id = result.DocId, Title = result.Title, ClassId = result.ClassId };
                        mHistory.Add(newHistory);

                        var documents = from d in result.Base
                                        orderby d.LineNumber

                                    select new BaseHistory()
                                    {
                                        BaseId = d.BaseId,
                                        Name = d.Title,
                                        BaseFinal = d.Final.Value,
                                        LineNumber = d.LineNumber.Value

                                    };

                        documents.ToList().ForEach(d => newHistory.BaseHis.Add(d));

                    }

这是我绑定到的属性

    private ObservableCollection<DocHistory> mHistory = new ObservableCollection<DocHistory>();
    public ObservableCollection<DocHistory> DocsHistory
            {
                get
                {
                    return mHistory;
                }
            }

我正在使用ItemsSource="{Binding Path=DocsHistory}"树视图

并且Hierarchial DataTemplate绑定到BaseHis

4

1 回答 1

3

如果你可以让BaseHis属性是一个IEnumerable,你可以这样做:

var results =
    (from d in mContext.Docs
     orderby d.Title ascending
     join b in mContext.Base on d.DocId equals b.DocId
     join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
     where h.ItemId == mGuid
     select new DocHistory 
     {
         Id = d.DocId, 
         Title = d.Title, 
         ClassId = d.ClassId,
         BaseHis =
             from b in d.Base
             orderby b.LineNumber
             select new BaseHistory
             {
                 BaseId = d.BaseId,
                 Name = d.Title,
                 BaseFinal = d.Final.Value,
                 LineNumber = d.LineNumber.Value
             }
    });

foreach(var r in results)
{
    mHistory.Add(r); 
} // or mHistory.AddRange(results)

即使您无法更改 的数据类型BaseHis,也可以使用匿名类来执行此操作:

var results =
    (from d in mContext.Docs
     orderby d.Title ascending
     join b in mContext.Base on d.DocId equals b.DocId
     join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
     where h.ItemId == mGuid
     select new
     {
         Id = d.DocId, 
         Title = d.Title, 
         ClassId = d.ClassId,
         BaseHis =
             from b in d.Base
             orderby b.LineNumber
             select new BaseHistory
             {
                 BaseId = d.BaseId,
                 Name = d.Title,
                 BaseFinal = d.Final.Value,
                 LineNumber = d.LineNumber.Value
             }
    });

foreach(var r in results)
{
    var hist = new DocHistory() 
    {
        Id = r.Id,
        Title = r.Title,
        ClassId = d.ClassId;
    };
    foreach(var h in r.BaseHis)
    {
        hist.BaseHis.Add(h);
    }

    mHistory.Add(r); 
}
于 2013-05-07T22:54:04.597 回答