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
; }
}
.
...