Sai Kiran Pulluri
Sai Kiran Pulluri

Reputation: 31

How to get access to text from all the textboxes( where textboxes are created dynamically) in windows phone runtime

I have been trying to get texts from the collection of textboxes which are created dynamically by binding a collection to a stackpanel using items control which is in seperate user control which i am loading on a page in windows phone runtime.

Below is the code of my UserControl:

<UserControl
    x:Class="CfMobility.UserControls.CredentialsUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CfMobility.UserControls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <ScrollViewer>
    <ItemsControl ItemsSource="{Binding SelectedCategorySettings}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel IsTapEnabled="False">
                    <TextBlock Text="{Binding SettingKey}" Style="{ThemeResource BaseTextBlockStyle}"></TextBlock>
                    <TextBox  Text="{Binding SettingValue}" Width="300px"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    </ScrollViewer>
</UserControl>

I have a Content control in another page as below:

<ContentControl x:Name="Container" Grid.Row="1" Margin="19,10,19,0">
        </ContentControl>

Where i am binding this content control to above stackpanel when i am navigating to the page.

As You can see i had bonded "SelectedCategorySettings" collection to StackPanel using ItemsScroll which displays number of text boxes based on the collecion. Here i am unable to figure out if i want to save text from all the text boxes which are displayed on the page into a json file, how to access the text of all the text boxes which are dynamically displayed in above scenario?

PS: note that items is control is in a separate user control.

Thanks in Advance

Upvotes: 0

Views: 100

Answers (2)

Jerry Nixon
Jerry Nixon

Reputation: 31803

What you need is a method like this:

var textBoxes = AllTextBoxes(this);

public List<TextBox> AllTextBoxes(DependencyObject parent)
{
    var list = new List<TextBox>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is TextBox)
        {
            list.Add(child as Control);
            continue;
        }
        list.AddRange(AllChildren(child));
    }
    return list;
}

Upvotes: 0

Tharaka Wijebandara
Tharaka Wijebandara

Reputation: 8055

You should use ObservableCollection for SelectedCategorySettings and your model class which contains SettingKey and SettingValue should implement INotifyPropertyChanged interface as in following example code. If you do it correctly then whatever the changes happen in UI (in your case, text changes of textbox) will automatically reflect in your model objects in the ObservableCollection. If you are interested to learn more about how this works, I recommend you to search about mvvm design pattern in Windows Phone development.

public class Setting : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _settingKey;

    public string SettingKey
    {
        get { return _settingKey; }
        set { 
            _settingKey = value;
            OnPropertyChanged("SettingKey");
        }
    }

    private string _settingValue;

    public string SettingValue
    {
        get { return _settingValue; }
        set {
            _settingValue = value;
            OnPropertyChanged("SettingValue");
        }
    }


    public virtual void OnPropertyChanged(string propertyName)
    {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Upvotes: 0

Related Questions