我想要带有复选框的TreeView,并且我尝试遵循this tutorial。但是,在其中,他在运行时为TreeView创建了所有内容。我有一个XML文件,可以在XAML中将其作为XmlDataProvider访问:

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]"
                 x:Key="versionsXml" />


我有一个具有IsCheckedName属性的视图模型类,我想用它来表示XML中的节点:

<Versions>
  <Version name="1.0">
    <Version name="1.0.001" />
    <Version name="1.0.002" />
  </Version>
</Versions>


我的TreeView将显示带有复选框的叶节点(即1.0.001和1.0.002)。如何直接用TreeView的内容而不是XmlDataProvider填充List<MyViewModel>?我可以在DataContext中创建一个返回List<MyViewModel>的属性,然后将我的TreeView绑定到该属性,但是我不知道如何在C#属性获取器中从。当我使用XmlDataProvider并将TryFindResource结果转换为object时,我的XmlDataProvider资源(在Document中定义)的DataversionsXml属性为null。

最佳答案

阅读this thread之后,我执行了以下操作:

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]"
                 x:Key="versionsXml" IsInitialLoadEnabled="True"
                 IsAsynchronous="False" />


然后,由于XmlDataProvider属性不再为null,因此在C#中访问Data数据:

var versions = new List<MyViewModel>();
var dataProvider = TryFindResource("versionsXml") as XmlDataProvider;
if (null == dataProvider)
{
    return versions;
}
var nodes = dataProvider.Data as IEnumerable;
if (null == nodes)
{
    return versions;
}
foreach (XmlElement node in nodes)
{
   ...
}

08-06 21:36