Jason Ebersey
Jason Ebersey

Reputation: 647

Change a textbox's text value on a UserControl from a Window in WPF

I have a UserControl (called Invoice) with a textbox (txtReferenceCode) hosted in a TabControl (myTabControl) on MainWindow. From the UserControl I call a window (SearchWindow) which contains a list of stock items. The window needs to return a string value to the textbox contained by the UserControl. I cannot access the textbox on the UserControl from the window and thus cannot pass the string value from the window to the text property.

The UserControl is an instance loaded as a new tabItem (there may be many open as content of tabitems.) I need to only affect the current tabitem instance of the UserControl.

Eg: (Button Click Event in SearchWindow)

Invoice.txtReferenceCode.Text = SearchWindow.txtReferenceCode.Text

I need a simple uncomplicated, solution preferably in VB (but I'll take C# gladly).

Upvotes: 3

Views: 5394

Answers (2)

Jason Ebersey
Jason Ebersey

Reputation: 647

I got it! I am posting the solution here for any who struggle with this issue.

XAML

WPF UserControl

<UserControl x:Class="Invoice"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">

        <TextBox x:Name="txtReferenceCode" Width=100 />

</UserControl>

WPF Window

<Window x:Class="SearchWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">

    <TextBox X:Name="TextToChangeTextBox" Width=100 />

</Window>

Code Behind

Add a Property to your Window

Class SearchWindow 

     Public ReadOnly Property TextValue
             Get
                 Return TextToChangeTextBox.Text
             End Get
     End Property

     ...

End Class

now you can use the property in your window to pass a string to the TextBox on the UserControl.

Public Class Invoice

    Private Sub SetValueToTextBox

            Dim win As New SearchWindow
            win.ShowDialog()

            txtReferenceCode.Text = win.TextValue

    End Sub

    ...

End Class

*

And That's it! EASY!

*

Upvotes: 3

viggity
viggity

Reputation: 15237

There are much better ways to go about doing this (i.e. share a viewmodel between the two windows and let binding update the textbox as needed).

But if you insist on doing it this way, try adding a public modifier to your textbox, that should let you access it like you want to.

<TextBox Name="txtReferenceCode" x:FieldModifier="public"/>

Upvotes: 1

Related Questions