Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过CSOM将TermCollection转换为Tree对象_C#_Wpf_Treeview_Sharepoint 2013 - Fatal编程技术网

C# 如何通过CSOM将TermCollection转换为Tree对象

C# 如何通过CSOM将TermCollection转换为Tree对象,c#,wpf,treeview,sharepoint-2013,C#,Wpf,Treeview,Sharepoint 2013,我正在通过SharePoint客户端对象模型查询SharePoint 2013术语库,以获取术语集合 我想将结果绑定到WPF TreeView控件。你知道我怎样才能把术语集合变成树视图能理解的东西吗 public static TermCollection GetTaxonomyTerms(string webUrl, string libraryTitle, string fieldTitle) { var context = new ClientContext

我正在通过SharePoint客户端对象模型查询SharePoint 2013术语库,以获取术语集合

我想将结果绑定到WPF TreeView控件。你知道我怎样才能把术语集合变成树视图能理解的东西吗

    public static TermCollection GetTaxonomyTerms(string webUrl, string libraryTitle, string fieldTitle)
    {
        var context = new ClientContext(webUrl);
        var web = context.Web;
        var list = web.Lists.GetByTitle(libraryTitle);
        var fields = list.Fields;
        var field = context.CastTo<TaxonomyField>(fields.GetByInternalNameOrTitle(fieldTitle));
        context.Load(field);

        var termStores = TaxonomySession.GetTaxonomySession(context).TermStores;
        context.Load(termStores);

        context.ExecuteQuery(); // TODO: Can this ExecuteQuery be avoided by using a LoadQuery statement?
        var termStore = termStores.Where(t => t.Id == field.SspId).FirstOrDefault();
        var termSet = termStore.GetTermSet(field.TermSetId);
        var terms = termSet.GetAllTerms(); //TODO: Do we need a version that returns a paged set of terms? or queries the server again when a node is expanded?
        context.Load(terms);

        context.ExecuteQuery();
        return terms;
    }
publicstatictermcollection GetTaxonomyTerms(stringweburl、stringlibrarytitle、stringfieldtitle)
{
var context=newclientcontext(webUrl);
var web=context.web;
var list=web.Lists.GetByTitle(libraryTitle);
var字段=list.fields;
var field=context.CastTo(fields.GetByInternalNameOrTitle(fieldTitle));
加载(字段);
var termStores=TaxonomySession.GetTaxonomySession(context.termStores);
加载(术语库);
context.ExecuteQuery();//TODO:使用LoadQuery语句可以避免此ExecuteQuery吗?
var termStore=termStores.Where(t=>t.Id==field.SspId).FirstOrDefault();
var termSet=termStore.GetTermSet(field.TermSetId);
var terms=termSet.GetAllTerms();//TODO:我们需要一个返回分页术语集的版本吗?还是在节点展开时再次查询服务器?
上下文。加载(术语);
context.ExecuteQuery();
退货条款;
}

我最终编写了自己的代码(如果有更简单的方法,请告诉我)。 我下面的“术语”对象只是一个简单的POCO,带有名称和术语

        var terms = SharePointHelper.GetTaxonomyTerms(webUrl, libraryTitle, fieldTitle);
        var term = terms.AsRootTreeViewTerm();
        ....
    }

    public static Term AsRootTreeViewTerm(this SP.TermCollection spTerms)
    {
        var root = new Term();
        foreach (SP.Term spTerm in spTerms)
        {
            List<string> names = spTerm.PathOfTerm.Split(';').ToList();
            var term = BuildTerm(root.Terms, names);
            if (!root.Terms.Contains(term))
                root.Terms.Add(term);
        }
        return root;
    }

    static Term BuildTerm(IList<Term> terms, List<string> names)
    {
        Term term = terms.Where(x => x.Name == names.First())
                         .DefaultIfEmpty(new Term() { Name = names.First() })
                         .First();
        names.Remove(names.First());
        if (names.Count > 0)
        {
            Term child = BuildTerm(term.Terms, names);
            if (!term.Terms.Contains(child))
                term.Terms.Add(child);
        }
        return term;
    }
var terms=SharePointHelper.GetTaxonomyTerms(webUrl、libraryTitle、fieldTitle);
var term=terms.AsRootTreeViewTerm();
....
}
公共静态术语AsRootTreeViewTerm(此SP.TermCollection spTerms)
{
var root=新术语();
foreach(特殊条款中的特殊条款)
{
列表名称=spTerm.PathOfTerm.Split(“;”).ToList();
var term=BuildTerm(root.Terms,名称);
如果(!root.Terms.Contains(term))
root.Terms.Add(term);
}
返回根;
}
静态术语构建术语(IList术语、列表名称)
{
Term=terms.Where(x=>x.Name==names.First())
.DefaultIfEmpty(新术语(){Name=names.First()})
.First();
names.Remove(names.First());
如果(names.Count>0)
{
Term child=BuildTerm(Term.Terms,名称);
如果(!term.Terms.Contains(子项))
术语。术语。添加(子项);
}
回报期;
}