WPF TreeView refreshing
After many hours finally found a solution!
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;}
For some reason nothing under the sun worked for me and all I needed was to refresh an image on my tree if that item was changed. so I did something ridiculous but worked great.First I added a Loaded event to my image and I set the Tag as the unique id of the record from the database
Tag="{Binding ObjectId}" Loaded="imgCheckComment_Loaded"
in the codebehind on that loaded event I built a list of every image
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); }
then any time I made a change to anything I updated the Image property of Item (Item is the custom class I bound to my tree) I brute force updated the object
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; } }); }