C# wpftreeview刷新

C# wpftreeview刷新,c#,wpf,xml,treeview,C#,Wpf,Xml,Treeview,我有个问题。我在WPF项目中使用TreeView来可视化XML数据。问题是,当我编辑XmlDocument时,它不会在TreeView中刷新。但我注意到,当我选中SelectedNode时,它是我编辑的XmlNode。所以我的“编辑”方法工作得很好,但在可视化刷新我的树时只有一个问题.Refresh()或.Items.Refresh()也不起作用 以下是我的树的模板: <DataTemplate x:Key="AttributeTemplate"> <StackPane

我有个问题。我在WPF项目中使用
TreeView
来可视化XML数据。问题是,当我编辑
XmlDocument
时,它不会在
TreeView
中刷新。但我注意到,当我选中
SelectedNode
时,它是我编辑的
XmlNode
。所以我的“编辑”方法工作得很好,但在可视化刷新我的树时只有一个问题
.Refresh()
.Items.Refresh()
也不起作用

以下是我的树的模板:

<DataTemplate x:Key="AttributeTemplate">
    <StackPanel Orientation="Horizontal"
            Margin="3,0,0,0"
            HorizontalAlignment="Center">
        <TextBlock Text="{Binding Path=Name}"
             Foreground="{StaticResource xmAttributeBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="=&quot;"
             Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="{Binding Path=Value, Mode=TwoWay}"
             Foreground="{StaticResource xmlValueBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="&quot;"
             Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" />
    </StackPanel>
</DataTemplate>

<HierarchicalDataTemplate x:Key="NodeTemplate">
    <StackPanel Orientation="Horizontal" Focusable="False">
        <TextBlock x:Name="tbName" Text="?" FontFamily="Consolas" FontSize="8pt" />
        <ItemsControl
            ItemTemplate="{StaticResource AttributeTemplate}"
            ItemsSource="{Binding Path=Attributes}"
            HorizontalAlignment="Center">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </StackPanel>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding XPath="*" />
    </HierarchicalDataTemplate.ItemsSource>
    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
            <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value, Mode=TwoWay}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
            <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>

<Style x:Key="TreeViewAllExpandedStyle"  TargetType="{x:Type TreeView}">
    <Style.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </Style.Resources>
</Style>

<Style x:Key="TreeViewAllCollapsedStyle" TargetType="{x:Type TreeView}">
    <Style.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="False" />
        </Style>
    </Style.Resources>
</Style>
这是我的树:

<TreeView x:Name="XmlTree" Grid.Row="1"
      ItemsSource="{Binding Source={StaticResource XmlData}, XPath=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      ItemTemplate="{StaticResource NodeTemplate}"
      SelectedItemChanged="XmlTree_SelectedItemChanged" />

下面是我的代码:

private XmlDocument _xml;
private XmlElement _selectedElement;
private XmlDataProvider _xmlDataProvider;

private void MainWindow_Load(object sender, EventArgs e)
{
    XmlTree.Style = (Style)FindResource("TreeViewAllExpandedStyle");
    _xmlDataProvider = FindResource("XmlData") as XmlDataProvider;
}

private void OpenXmlFile(string filePath)
{
    _xml = new XmlDocument();
    _xml.Load(filePath);

    _xmlDataProvider.Document = _xml;
}

private void SaveChangesButton_Click(object sender, EventArgs e)
{
    Dictionary<string, string> newAttributes = GetChangedAttributes();
    foreach (KeyValuePair<string, string> pair in newAttributes)
    {
        _selectedElement.SetAttribute(pair.Key, pair.Value);
    }

    RefreshViews();
}

private void RefreshViews()
{
    // now I don't know what to do here, any Refresh doesn't work:S
}
private-XmlDocument\u-xml;
私有XmlElement _selectedElement;
私有XmlDataProvider_XmlDataProvider;
私有void主窗口加载(对象发送方、事件参数)
{
Style=(Style)FindResource(“TreeViewer扩展样式”);
_xmlDataProvider=FindResource(“XmlData”)作为xmlDataProvider;
}
私有void OpenXmlFile(字符串文件路径)
{
_xml=新的XmlDocument();
_Load(文件路径);
_Document=\uXML;
}
私有无效保存更改按钮单击(对象发送者,事件参数e)
{
Dictionary newAttributes=GetChangedAttributes();
foreach(newAttributes中的KeyValuePair对)
{
_selectedElement.SetAttribute(pair.Key、pair.Value);
}
刷新视图();
}
私有视图()
{
//现在我不知道该怎么做,任何刷新都不起作用:S
}

第二件事是,如何清除我的树,以便能够再次将其用于另一个数据(我在尝试
XmlTree.Items.clear();

时遇到了
NullReferenceException
,经过数小时后终于找到了解决方案

private void RefreshViews()
{
    XmlEditor.Clear();
    XmlEditor.Text = IndentXml();

    UnselectSelectedItem();

    XmlTree.Items.Refresh();
    XmlTree.UpdateLayout();
}

private void UnselectSelectedItem()
{
    if (XmlTree.SelectedItem != null)
    {
        var container = FindTreeViewSelectedItemContainer(XmlTree, XmlTree.SelectedItem);
        if (container != null)
        {
            container.IsSelected = false;
        }
    }
}

private static TreeViewItem FindTreeViewSelectedItemContainer(ItemsControl root, object selection)
{
    var item = root.ItemContainerGenerator.ContainerFromItem(selection) as TreeViewItem;
    if (item == null)
    {
        foreach (var subItem in root.Items)
        {
            item = FindTreeViewSelectedItemContainer((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(subItem), selection);
            if (item != null)
            {
                break;
            }
        }
    }

    return item;
}

由于某种原因,阳光下的一切对我都不起作用,我所需要的就是在我的树上刷新一个图像,如果这个项目被更改了。所以我做了一些可笑的事情,但效果很好。 首先,我向图像中添加了一个已加载的事件,并将标记设置为数据库中记录的唯一id

Tag="{Binding ObjectId}" Loaded="imgCheckComment_Loaded"
在加载事件的代码隐藏中,我建立了每个图像的列表

private List<Image> commentColors = new List<Image>();
    private void imgCheckComment_Loaded(object sender, RoutedEventArgs e)
    {
        var si = sender as Image;
        if (si != null)
            commentColors.Add(si);
    }

你是最棒的!我需要这些神奇的句子:XmlTree.Items.Refresh();XmlTree.UpdateLayout();非常感谢,解决了我的问题!Yeee,它们会让人紧张:)
private List<Image> commentColors = new List<Image>();
    private void imgCheckComment_Loaded(object sender, RoutedEventArgs e)
    {
        var si = sender as Image;
        if (si != null)
            commentColors.Add(si);
    }
    public void RefreshContext(Item selectedItem)
    {
        commentColors.ForEach(si => { 
            if (selectedItem.ObjectId == Convert.ToInt32(si.Tag))
            {
                si.Source = new BitmapImage(new Uri(selectedItem.Image, UriKind.Relative));
                return;
            }
        });
    }