If I set Path via mvvm BreadCrump not want to update UI or simple show only root name.
Path="{Binding Path=SelectedTreePath, Mode=TwoWay }"
<telerik:RadBreadcrumb x:Name="breadcrumbDocumentCategory" Header="{Binding PathDocumentsTree}" ItemsSource="{Binding Path=PathDocumentsTree.ChildNodes, Mode=TwoWay}" PathSeparator="/" TextModePath="Header" Path="{Binding Path=SelectedTreePath, Mode=TwoWay }" IsHistoryEnabled="True"> <telerik:RadBreadcrumb.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding CategoryName}" /> </DataTemplate> </telerik:RadBreadcrumb.HeaderTemplate> <telerik:RadBreadcrumb.ItemTemplate> <telerik:HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}"> <TextBlock Text="{Binding CategoryName}" /> </telerik:HierarchicalDataTemplate> </telerik:RadBreadcrumb.ItemTemplate> </telerik:RadBreadcrumb>
private string _selectedTreePath; public string SelectedTreePath { get { _recResult = string.Empty; if (this.SelectedTreeNode as CategoryViewModel != null && PathDocumentsTree != null) { _selectedTreePath = ContainerFromItemRecursive( this.SelectedTreeNode as CategoryViewModel, PathDocumentsTree.ChildNodes); Breadcrumb.Path = _selectedTreePath; } return _selectedTreePath; } set { _selectedTreePath = value; RaisePropertyChanged(() => SelectedTreePath); } } private string ContainerFromItemRecursive(CategoryViewModel selectedTreeNode, IEnumerable<CategoryTree> documentTree, string path = null) { if (documentTree != null) { string mp = path; int n = 0; foreach (var item in documentTree) { mp = mp + CPathSeparator + item.CategoryName; if (item.CategoryId == selectedTreeNode.ID) { path = GetPath(mp, n) + CPathSeparator + item.CategoryName; _recResult = CRootName + CPathSeparator + path.Replace( "//", CPathSeparator); break; } else { ContainerFromItemRecursive(selectedTreeNode, item.ChildNodes, mp); } n++; } } return _recResult.Replace("//", CPathSeparator); } 2. Second problem is runtime error if I use CurrentItem to change UI address in RadBreadcrumb (if not appear error it is work correct).
My be problem is becouse I do not use your recursive travers tree function like ContainerFromItemRecursive()?
this
.explorerBreadcrumb.Path = this.explorerTree.ContainerFromItemRecursive(e.AddedItems[0]).FullPath;
But I thing mine function result is equal to yours?
I have error in when call RaisePropertyChanged(() => SelectedTreePathItem);
//Error
Ambiguous match found.
{System.Collections.ListDictionaryInternal}
at System.RuntimeType.GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
at System.Type.GetProperty(String name)
at Telerik.Windows.Controls.RadBreadcrumb.GetItemChildren(Object currentItem)
at Telerik.Windows.Controls.RadBreadcrumb.FindCurrentItemRecursively(String currentPath, IEnumerable items, Object searchValue)
at Telerik.Windows.Controls.RadBreadcrumb.FindCurrentItem(Object newValue)
at Telerik.Windows.Controls.RadBreadcrumb.OnCurrentItemChanged(Object oldValue, Object newValue)
at Telerik.Windows.Controls.RadBreadcrumb.OnCurrentItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp)
at System.Windows.Data.BindingExpression.SendDataToTarget()
at System.Windows.Data.BindingExpression.SourcePropertyChanged(PropertyPathListener sender, PropertyPathChangedEventArgs args)
at System.Windows.PropertyPathListener.ReconnectPath()
at System.Windows.Data.Debugging.BindingBreakPoint.<>c__DisplayClass4.<BreakOnSharedType>b__3()
//my binding property in ViewModel
private CategoryTree _selectedTreePathItem;
public CategoryTree SelectedTreePathItem
{
get
{
_recCategoryResult = null;
if (this.SelectedTreeNode as CategoryViewModel != null && PathDocumentsTree != null)
{
_selectedTreePathItem = RecursiveTraverseTreeAndLocateItemById(this.SelectedTreeNode as CategoryViewModel, PathDocumentsTree.ChildNodes);
//if (_selectedTreePathItem != null)
// _selectedTreePathItem.ChildNodes.Clear();
}
return _selectedTreePathItem;
}
set { _selectedTreePathItem = value; RaisePropertyChanged(() => SelectedTreePathItem); }
}
// my RadBreadcrumb with CurrentItem
<telerik:RadBreadcrumb Header="{Binding PathDocumentsTree}" ItemsSource="{Binding Path=PathDocumentsTree.ChildNodes, Mode=TwoWay}" PathSeparator="/" TextModePath="Header" CurrentItem="{Binding SelectedTreePathItem, Mode=TwoWay}" IsHistoryEnabled="True"> <telerik:RadBreadcrumb.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding CategoryName}" /> </DataTemplate> </telerik:RadBreadcrumb.HeaderTemplate> <telerik:RadBreadcrumb.ItemTemplate> <telerik:HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}"> <TextBlock Text="{Binding CategoryName}" /> </telerik:HierarchicalDataTemplate> </telerik:RadBreadcrumb.ItemTemplate> </telerik:RadBreadcrumb>
// my function that return value
private CategoryTree _recCategoryResult; private CategoryTree RecursiveTraverseTreeAndLocateItemById(CategoryViewModel selectedTreeNode, IEnumerable<CategoryTree> documentTree) { foreach (var item in documentTree) { if (item.CategoryId == selectedTreeNode.ID) { _recCategoryResult = item; break; } RecursiveTraverseTreeAndLocateItemById(selectedTreeNode, item.ChildNodes); } return _recCategoryResult; } // my models public class CategoryTree : FeatureCategoryTreeNode, ICategoryTree, INotifyPropertyChanged { private ObservableCollection<CategoryTree> _childNodes; public new ObservableCollection<CategoryTree> ChildNodes { get { return _childNodes; } set { _childNodes = value; OnPropertyChanged("ChildNodes"); } } public CategoryTree(string name) { this.CategoryName = name; this.ChildNodes = new ObservableCollection<CategoryTree>(); } public CategoryTree(ICategoryTree categoryTree) { this.CategoryName = categoryTree.CategoryName; this.ChildNodes = new ObservableCollection<CategoryTree>(); } public CategoryTree(FeatureCategory featureCategory) { this.CategoryName = featureCategory.CategoryName; this.CategoryId = featureCategory.CategoryId; this.ParentId = featureCategory.ParentId; this.ChildNodes = new ObservableCollection<CategoryTree>(); } public CategoryTree(IFeatureCategory featureCategory) { this.CategoryName = featureCategory.CategoryName; this.CategoryId = featureCategory.CategoryId; this.ParentId = featureCategory.ParentId; this.ChildNodes = new ObservableCollection<CategoryTree>(); } public CategoryTree() { } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public interface ICategoryTree { string CategoryName { get; set; } ObservableCollection<CategoryTree> ChildNodes { get; set; } Guid CategoryId { get; set; } Guid ParentId { get; set; } }
.
...