Hi, I am building an application where I need to represent some hierarchical data in a tree. The standard WPF tree fell short on many fronts. So I am doing a trial of your WPF controls.
One of the big issues with the standard tree was that it was not (easily) possible to select an item within the tree from outside the tree. I was looking at your documentation, and it clearly shows that you can indeed use the SelectedItem property on your RadTreeView to set the selected item in the tree.
So I have implemented your tree and am trying to use that property to set the item, but I cannot get it to work. I have tried both through declarative binding and by setting the property programmatically, and in either case the RadTreeView does not set the correct item on the tree. It simply does nothing.
What am I doing wrong? If I can get that feature working with your RadTreeView, along with proper node Double-clicking, we will be purchasing at least developer licenses of the WPF RadControls.
Here is the TreeView code I am doing declaratively:
<
t:RadTreeView
Grid.Column
=
"0"
Grid.Row
=
"2"
MinHeight
=
"100"
MinWidth
=
"100"
DataContext
=
"{Binding Source={x:Static SizingApp:ProjectManager.Instance}}"
SelectedItem
=
"{Binding CurrentSelected}"
>
<
t:RadTreeView.Resources
>
<
Style
TargetType
=
"{x:Type t:RadTreeViewItem}"
>
<
Setter
Property
=
"IsExpanded"
Value
=
"True"
/>
</
Style
>
<
HierarchicalDataTemplate
x:Key
=
"LoadTemplate"
>
<
Grid
>
<
TextBlock
Text
=
"{Binding Name}"
>
<
TextBlock.ContextMenu
>
<
ContextMenu
DataContext
=
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Edit_InputGestureText}"
Click
=
"MenuItem_EditLoadClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
load_ContextMenu_Edit_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Click
=
"MenuItem_SaveLoadClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
load_ContextMenu_Save_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=load_ContextMenu_SaveAs_Header}"
Click
=
"MenuItem_SaveAsLoadClick"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Delete_InputGestureText}"
Click
=
"MenuItem_RemoveClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
load_ContextMenu_Delete_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Copy_Header}"
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Copy_InputGestureText}"
Click
=
"MenuItem_CopyLoadClick"
/>
</
ContextMenu
>
</
TextBlock.ContextMenu
>
</
TextBlock
>
</
Grid
>
</
HierarchicalDataTemplate
>
<
HierarchicalDataTemplate
x:Key
=
"StepTemplate"
ItemsSource
=
"{Binding Loads}"
ItemTemplate
=
"{StaticResource LoadTemplate}"
>
<
Grid
>
<
TextBlock
Text
=
"{Binding Name}"
>
<
TextBlock.ContextMenu
>
<
ContextMenu
DataContext
=
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Edit_InputGestureText}"
Click
=
"MenuItem_EditStepClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
step_ContextMenu_Edit_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Click
=
"MenuItem_SaveStepClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
step_ContextMenu_Save_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_SaveAs_Header}"
Click
=
"MenuItem_SaveAsStepClick"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Delete_InputGestureText}"
Click
=
"MenuItem_RemoveClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
step_ContextMenu_Delete_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Copy_Header}"
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Copy_InputGestureText}"
Click
=
"MenuItem_CopyStepClick"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Paste_InputGestureText}"
IsEnabled
=
"{Binding IsLoadCopied, Source={x:Static SizingApp:ProjectManager.Instance}}"
Click
=
"MenuItem_PasteLoadClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding CurrentCopiedLoad,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
step_ContextMenu_Paste_Header
},
Converter={StaticResource NameConverter},
Source={x:Static SizingApp:ProjectManager.Instance},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Import_Load_Header}"
Click
=
"MenuItem_OpenLoadClick"
/>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=step_ContextMenu_Add_Load_Header}"
ItemsSource
=
"{StaticResource mnuLoadSubmenuCommon}"
MenuItem.Click
=
"StepMenuItem_AddLoadClick"
/>
</
ContextMenu
>
</
TextBlock.ContextMenu
>
</
TextBlock
>
</
Grid
>
</
HierarchicalDataTemplate
>
<
HierarchicalDataTemplate
x:Key
=
"ProjectTemplate"
ItemsSource
=
"{Binding Steps}"
ItemTemplate
=
"{StaticResource StepTemplate}"
>
<
Grid
>
<
TextBlock
Text
=
"{Binding Name}"
>
<
TextBlock.ContextMenu
>
<
ContextMenu
DataContext
=
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Edit_InputGestureText}"
Click
=
"MenuItem_EditProjectClick"
DataContext
=
"{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
project_ContextMenu_Edit_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Click
=
"MenuItem_SaveProjectClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
project_ContextMenu_Save_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=project_ContextMenu_SaveAs_Header}"
Click
=
"MenuItem_SaveAsProjectClick"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=project_ContextMenu_Delete_InputGestureText}"
Click
=
"MenuItem_RemoveClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding
Path
=
Name
,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
project_ContextMenu_Delete_Header
},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=project_ContextMenu_Copy_Header}"
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=project_ContextMenu_Copy_InputGestureText}"
Click
=
"MenuItem_CopyProjectClick"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=project_ContextMenu_Paste_InputGestureText}"
IsEnabled
=
"{Binding IsStepCopied, Source={x:Static SizingApp:ProjectManager.Instance}}"
Click
=
"MenuItem_PasteStepClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding CurrentCopiedStep,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
project_ContextMenu_Paste_Header
},
Converter={StaticResource NameConverter},
Source={x:Static SizingApp:ProjectManager.Instance},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Project_ImportStep_Header}"
Click
=
"MenuItem_OpenStepClick"
/>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Project_AddStep_Header}"
Click
=
"MenuItem_AddStepsClick"
/>
</
ContextMenu
>
</
TextBlock.ContextMenu
>
</
TextBlock
>
</
Grid
>
</
HierarchicalDataTemplate
>
</
t:RadTreeView.Resources
>
<
t:RadTreeViewItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}"
ItemsSource
=
"{Binding Projects}"
IsExpanded
=
"True"
ItemTemplate
=
"{StaticResource ProjectTemplate}"
>
<
t:RadTreeViewItem.ContextMenu
>
<
ContextMenu
DataContext
=
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_NewProject_Header}"
Icon
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=addProject_Image_Small}"
Click
=
"NewProject_Click"
/>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_OpenProject_Header}"
Icon
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=openProject_Image_Small}"
Click
=
"OpenProject_Click"
/>
<
MenuItem
Header
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_SaveAll_Header}"
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_SaveAll_InputGestureText}"
Click
=
"SaveAllProjects_Click"
/>
<
MenuItem
InputGestureText
=
"{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Paste_InputGestureText}"
IsEnabled
=
"{Binding IsProjectCopied, Source={x:Static SizingApp:ProjectManager.Instance}}"
Click
=
"MenuItem_PasteProjectClick"
>
<
MenuItem.Header
>
<
TextBlock
Text="{Binding CurrentCopiedProject,
StringFormat={Resx
ResxName
=
PSSPECApplication
.Controls.ProjectControlResources,
Key
=
projectTree_Paste_Header
},
Converter={StaticResource NameConverter},
Source={x:Static SizingApp:ProjectManager.Instance},
Mode
=
OneWay
}" />
</
MenuItem.Header
>
</
MenuItem
>
</
ContextMenu
>
</
t:RadTreeViewItem.ContextMenu
>
</
t:RadTreeViewItem
>
</
t:RadTreeView
>
Now the Projects property that the first node ItemsSource is bound to works just fine. However, the SelectedItem property on the TreeView itself seems to do nothing. Both the Projects property and the CurrentSelected property are both DependencyProperties. Both have call back event handlers that fire off INotifyPropertyChanged PropertyChanged event handlers indicating the properties have changed. I have other controls on the application that are bound to CurrentSelected and they change along with CurrentSelected just fine.
So why doesn't the RadTreeView also?