Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
120
Getting textbox in content pane to receive a "lost focus"
posted

I have a grid with SAVE button. Then I have a dockmanager which has 2 tabgrouppanes. The first tabgrouppane has a content pane which has a title textbox and few other fields.

Binding for title seems to happen only when we TAB out of the text box. Hitting SAVE without leaving the textbox does not do the binding. How do I get the textbox to receive a "lost focus" when I click on the SAVE button. Attaching sample code.

Thanks.

<Grid>
 <Grid x:Name="Grid_MenuBar">
                                    <Button
     x:Name="Save"
     Grid.Column="1"
     Grid.Row="0"
     Margin="5"
 </Grid>

 <igDock:XamDockManager Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
 <igDock:XamDockManager.Panes>
                                    <igDock:SplitPane igDock:XamDockManager.InitialLocation="DockedTop" SplitterOrientation="Horizontal">
                                        <igDock:TabGroupPane>
                                            <igDock:ContentPane Header="Primary">
                                                <Grid x:Name="Song">                                                  
                                                    <TextBlock x:Name="SongTitle_txt"
         Text="Title"
         Grid.Row="1"
         Grid.Column="2"
         Margin="0,0,5,0" />
                                                   
                                                    <TextBox
        x:Name="SongTitle_box"
        BorderThickness="0.5,0.5,0.5,0.5"
        Grid.Row="1"
        Grid.Column="3"       
        Text="{Binding Path=Title, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
         </igDock:ContentPane>
     </igDock:TabGroupPane>
    </igDock:SplitPane>
 </igDock:XamDockManager.Panes>
</Grid>

 

Parents Reply
  • 54937
    Offline posted in reply to Thomas

    WPF has 2 types of Focus - Keyboard Focus and Logical Focus. These are explained in MS' documentation regarding Focus.

    For Keyboard Focus there is only ever 1 element that has keyboard focus - that is the one that is receiving the keyboard input. This is reflected via the Keyboard.FocusedElement property. There are LostKeyboardFocus and GotKeyboardFocus that relate to when an element (or one of its descendants) loses or receives the keyboard focus.

    For Logical Focus, every Focus Scope has it's own focused element. This is exposed via the attached FocusManager.FocusedElement. Any element that is marked as a FocusScope (e.g. Window, Toolbar, Menu, Ribbon, ContentPane, etc.) will have its own focused element. The LostFocus and GotFocus events relate to when an element (or one of its descendants) becomes or is no longer the focused element for its containing focus scope. When you shift keyboard focus from one focus scope to another (e.g. click on a menu item, a toolbar, or into another contentpane) then these events are not triggered for the element that had the keyboard focus because it is still the FocusedElement of its containing FocusScope.

    So what I was saying was that if you want the LostFocus of an element to occur that you would need to change the FocusedElement of its FocusScope as that is the only time that the WPF framework will raise the GotFocus/LostFocus events. There isn't really an ideal place to do that though especially since I believe the WPF framework will try to change the keyboard focus when you change the focused element of a focus scope. At least for the scenario raised by the original poster, the best option would be to set the UpdateSourceTrigger to PropertyChanged.

    Note even if the ContentPane wasn't a FocusScope (and instead it belonged to the focusscope of one of its ancestors - e.g. the Window) you could still have such issues when an element was floating as a Window is a FocusScope and since it has no visual parent it would not cause the LostFocus/GotFocus when shifting keyboard focus between Windows (e.g. between the main window and a floating window).

Children