wpf - 用动态数据集替换 WPF 用户控件中的静态 XmlDataProvider 的正确方法是什么?

标签 wpf data-binding treeview

问题可能需要编辑,因为我认为我不一定知道最好的方法。

我的 WPF 用户控件的当前配置。
我有一个 XmlDataProvider,其中包含一些我用来填充 TreeView 控件的静态 XML 元素。
我目前使用 HierarchicalDataTemplate 绑定(bind)到 TreeViewItem

    <HierarchicalDataTemplate x:Key="SiteTemplate" ItemsSource="{Binding XPath=pci}">
        <TextBlock Text="{Binding XPath=@Name}"/>
    </HierarchicalDataTemplate>
    <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="True"/>
    </Style>

TreeView 控件
 <TreeView ItemsSource="{Binding Source={StaticResource SharePointSites}}" 
                              ItemTemplate="{StaticResource SiteTemplate}" 

我想用运行时从 xml 文件加载的数据替换当前的静态资源。此外,我希望用户能够在运行时修改 TreeView 的节点,并将这些值写回同一个 xml 文件。
我一直在阅读有关使用 MVVM 模式和创建 IObservable 类的信息。有人可以指出我正确的方向吗?

编辑:
也许我以次优的方式问了这个问题。无论如何,任何人都可以推荐改进或进行编辑以提高问题的质量吗?

最佳答案

我无法访问我的 Visual Studio 环境,所以下面的代码将充满编译错误...所以请将此视为伪代码...

假设您的 Xml 结构是这样的......

<MyItem Name="Root"> 
    <MyItem Name="ABC"/> 
    <MyItem Name="PQR"> 
        <MyItem Name="IJK"/> 
    </MyItem> 
    <MyItem Name="XYZ"/> 
</MyItem> 
  • 通过转换器绑定(bind)您的 ItemsSource,例如 MyXmlToObjectDataSourceConverter。
    <TreeView ItemsSource="{Binding Source={StaticResource SharePointSites},
           Converter={StaticResource MyXmlToObjectDataSourceConverter}}" ... />
    
  • 在 MyXmlToObjectDataSourceConverter.Convert() 方法中返回这个...
    public object Convert(...) 
    { 
        return new ObservableCollection<XmlNodeWrapper>(
            ((XmlDataProvider)value).Document.SelectNodes("MyItem").Select( 
                d => new XmlNodeWrapper(d)).ToList()) 
    }
    
  • XmlNodeWrapper 类将在内部维护“节点”,以便在通过属性 setter 进行更新时,
    您可以更新基于节点的属性...像这样...
    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)); 
            } 
        }
    } 
    
  • 然后将 XAML 中的所有 XPath 属性替换为标准路径。
    <HierarchicalDataTemplate x:Key="SiteTemplate"
        ItemsSource="{Binding Path=Children}"> 
            <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate>
    
  • 关于wpf - 用动态数据集替换 WPF 用户控件中的静态 XmlDataProvider 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588442/

    相关文章:

    c# - 在 WPF/C# 中,如何检查中心按钮是否被单击或释放?

    c# - MVVM,我是否必须将每个命令保留在自己的类中?

    javascript - 在纯 Javascript 中从 Url 生成 Treeview

    wpf - TreeViewItem - 一起使用 ControlTemplate 和 HierarchicalDataTemplate

    c# - 是否可以将数据绑定(bind)到扩展方法?

    javascript - SharePoint 2013 使用javascript构建站点树状导航

    c# - 如何在轮盘赌中将球停在特定数字

    wpf - 在 VS2017 中隐藏在 IntelliSense 中的调度程序

    windows-phone-7 - Windows Phone 7 数据绑定(bind)外部属性(非静态超链接文本)

    javascript - 通过 Eval 将多个参数传递给 Javascript 函数