我想要带有复选框的TreeView
,并且我尝试遵循this tutorial。但是,在其中,他在运行时为TreeView
创建了所有内容。我有一个XML文件,可以在XAML中将其作为XmlDataProvider
访问:
<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]"
x:Key="versionsXml" />
我有一个具有
IsChecked
和Name
属性的视图模型类,我想用它来表示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
中定义)的Data
和versionsXml
属性为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)
{
...
}