TreeView SelectedItem doesn't work

3 posts, 1 answers
  1. Ristogod
    Ristogod avatar
    63 posts
    Member since:
    Aug 2008

    Posted 08 Oct 2010 Link to this post

    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?

  2. Ristogod
    Ristogod avatar
    63 posts
    Member since:
    Aug 2008

    Posted 08 Oct 2010 Link to this post

    I figured it out. The default Binding Mode for Selecteditem must be something other than TwoWay. As soon as I set the Mode=TwoWay, everything started working correctly! This is great as we now are looking at a dependable solution we can purchase.



    <t:RadTreeView Grid.Column="0" Grid.Row="2"
            MinHeight="100" MinWidth="100"
            DataContext="{Binding Source={x:Static SizingApp:ProjectManager.Instance}}"
            SelectedItem="{Binding CurrentSelected, Converter={StaticResource PSSpecConverter}, Mode=TwoWay}"
            SelectionMode="Single">
  3. UI for WPF is Visual Studio 2017 Ready
  4. Answer
    Alex Fidanov
    Admin
    Alex Fidanov avatar
    636 posts

    Posted 11 Oct 2010 Link to this post

    Hello Ristogod,

    The Default value of the Binding's Mode property varies based on the type of the dependency property. Usually user-editable properties (like Text|CheckBoxes) default to TwoWay bindings and the rest to OneWay. More information on this, you can find here. For RadTreeView.SelectedItem the binding mode would also default to OneWay so you have to explicitly set it to TwoWay, as you already have.

    Please let us know if you need further assistance on the matter.

    Best wishes,
    Alex Fidanov
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Back to Top