Ano*_*ype 5 data-binding wpf treeview
问题可能需要编辑,因为我认为我不一定知道这样做的最佳方法.
我的WPF用户控件的当前配置.我有一个XmlDataProvider,它包含一些我用来填充TreeView控件的静态XML元素.我目前使用HierarchicalDataTemplate绑定到TreeViewItem
<HierarchicalDataTemplate x:Key="SiteTemplate" ItemsSource="{Binding XPath=pci}">
<TextBlock Text="{Binding XPath=@Name}"/>
</HierarchicalDataTemplate>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
TreeView控件
<TreeView ItemsSource="{Binding Source={StaticResource SharePointSites}}"
ItemTemplate="{StaticResource SiteTemplate}"
Run Code Online (Sandbox Code Playgroud)
我想用运行时从xml文件加载的数据替换当前的静态资源.另外,我希望用户能够在运行时修改树视图的节点,并将这些值写回同一个xml文件.我一直在阅读有关使用MVVM模式和创建IObservable类的信息.有人能指出我正确的方向吗?
编辑:也许我以次优的方式问过这个问题.任何人都可以推荐改进或进行编辑以提高问题的质量吗?
我无法访问我的 Visual Studio 环境,因此下面的代码将充满编译错误...所以请将其视为伪代码...
假设你的 Xml 结构是这样的......
<MyItem Name="Root">
<MyItem Name="ABC"/>
<MyItem Name="PQR">
<MyItem Name="IJK"/>
</MyItem>
<MyItem Name="XYZ"/>
</MyItem>
Run Code Online (Sandbox Code Playgroud)
通过转换器(例如 MyXmlToObjectDataSourceConverter)绑定您的 ItemsSource。
<TreeView ItemsSource="{Binding Source={StaticResource SharePointSites},
Converter={StaticResource MyXmlToObjectDataSourceConverter}}" ... />
Run Code Online (Sandbox Code Playgroud)在 MyXmlToObjectDataSourceConverter.Convert() 方法中返回此...
public object Convert(...)
{
return new ObservableCollection<XmlNodeWrapper>(
((XmlDataProvider)value).Document.SelectNodes("MyItem").Select(
d => new XmlNodeWrapper(d)).ToList())
}
Run Code Online (Sandbox Code Playgroud)XmlNodeWrapper 类将在内部维护“节点”,以便当通过属性 Setters 进行更新时,您可以更新基于节点的属性...就像这样...
public class XmlNodeWrapper : INotifyPropertyChanged
{
private XmlNode node;
private ObservableCollection<XmlNodeWrapper> children;
public XmlNodeWrapper(XmlNode node)
{
this.node = node;
}
public ObservaleCollection<XmlNodeWrapper> Children
{
get
{
if (children == null)
{
this.children
= new ObservableCollection<XmlNodeWrapper>(
this.node.ChildNodes.Select(
d => new XmlNodeWrapper(d)).ToList());
}
return children;
}
}
public string Name
{
get
{
return node.Attributes["Name"];
}
set
{
node.Attributes["Name"] = value;
this.PropertyChanged["Name"];
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void PropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
Run Code Online (Sandbox Code Playgroud)然后将 XAML 中的所有 XPath 属性替换为标准 Path。
<HierarchicalDataTemplate x:Key="SiteTemplate"
ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)