Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 通过XElement使用数据绑定的XML数据在树视图上进行更新时遇到问题_C#_Wpf_Xml_Data Binding_Treeview - Fatal编程技术网

C# 通过XElement使用数据绑定的XML数据在树视图上进行更新时遇到问题

C# 通过XElement使用数据绑定的XML数据在树视图上进行更新时遇到问题,c#,wpf,xml,data-binding,treeview,C#,Wpf,Xml,Data Binding,Treeview,我在WPF中实现了一个TreeView,它通过XElement类绑定到一些XML数据。第一次加载XML文件时,绑定工作正常。所有数据按预期填充树。问题发生在我添加和删除元素时,因为树视图中没有发生任何事情。现在我已经做过了,我相信我记得我不需要为这项工作做任何额外的工作。至少对于从树中添加和删除项的简单情况。我记得我很惊讶,这没有任何额外的编码工作。我再也不能访问这些代码了,所以我不能只看我已经做了什么。所以我有点困惑,为什么我现在不能让它工作 我的WPF代码如下 <Window.Reso

我在WPF中实现了一个TreeView,它通过XElement类绑定到一些XML数据。第一次加载XML文件时,绑定工作正常。所有数据按预期填充树。问题发生在我添加和删除元素时,因为树视图中没有发生任何事情。现在我已经做过了,我相信我记得我不需要为这项工作做任何额外的工作。至少对于从树中添加和删除项的简单情况。我记得我很惊讶,这没有任何额外的编码工作。我再也不能访问这些代码了,所以我不能只看我已经做了什么。所以我有点困惑,为什么我现在不能让它工作

我的WPF代码如下

<Window.Resources>
    <HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}" x:Key="ViewEditTreeTemplate">
        <StackPanel Orientation="Horizontal" Margin="2">
            <Label x:Name="ElementHeaderLabel" Padding="1" VerticalContentAlignment="Center" FontSize="16" Content="{Binding Path=DisplayName}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</Window.Resources>


<Grid>
    <TreeView  Name="DataTree" ItemTemplate ="{Binding Source={StaticResource ViewEditTreeTemplate}}" Margin="0,0,0,53" />
</Grid>

我有一种强烈的感觉,当我以前这么做的时候,我其实不需要做任何特别的事情。.Remove()和.Add()例程以某种方式通知绑定,.Elements()中的项已更改,屏幕自动更新。不管是什么情况,这次都不行。有人知道为什么吗?

好的,我有一个解决我自己问题的办法。我不知道为什么我认为这本来可以不用做任何特别的事情,但事实似乎并非如此

为了进一步澄清这个问题,我没有按原样使用XElement对象,而是用另一个类对其进行包装,以便向其添加更多功能。这很好,因为事实证明我需要INotifyPropertyChanged接口并重写一些方法以获得我想要的行为。我的实际类标题如下所示

public class TreeElement : XElement, INotifyPropertyChanged
{
   ...
}
由于我的TreeView绑定在XElement.Elements()例程上,因此在我添加或删除元素时它不会收到通知。原因是XElement.Elements()不是依赖项属性。这是例行公事。我提前知道这一点,但出于某种原因,我很固执,仍然认为这会奏效。因此,我需要添加的是INotifyPropertyChanged接口,然后每当发生导致XElement.Elements()中的数据发生更改的操作时,调用NotifyPropertyChanged()例程。即,它们是XElement.Add()和XElement.Remove()例程。还有几个,但我只谈这两个

这些例程不可重写,但可以使用“new”关键字隐藏它们。下面是这些例程的新实现

public new void Remove()
{
    XElement parent = this.Parent;
    base.Remove();

    if ((parent != null) && (parent.GetType() == typeof(TreeElement)))
    {
    //need to tell parent that they are losing an element
    ((TreeElement)parent).NotifyPropertyChanged("Elements");
    }
}


public new void Add(object Content)
{
    base.Add(Content);
    NotifyPropertyChanged("Elements");
}

如您所见,即使.Elements()不是一个属性,NotifyPropertyChanged(“Elements”)方法在通知我的绑定'ItemsSource=“{binding Path=Elements}”时也可以正常工作。因此,现在当我使用.Add()或.Remove()更新代码隐藏时,我的树会自动更新。

您尝试过ObservableCollection而不是List吗?我没有尝试过,但我只是尝试过,没有任何改变。但我没想到它会起作用。该系列仅适用于最顶级的产品。在第一个元素之后,.elements()返回的集合将填充树,并与绑定交互。
public class TreeElement : XElement, INotifyPropertyChanged
{
   ...
}
public new void Remove()
{
    XElement parent = this.Parent;
    base.Remove();

    if ((parent != null) && (parent.GetType() == typeof(TreeElement)))
    {
    //need to tell parent that they are losing an element
    ((TreeElement)parent).NotifyPropertyChanged("Elements");
    }
}


public new void Add(object Content)
{
    base.Add(Content);
    NotifyPropertyChanged("Elements");
}